Skip to content

Commit 69c2802

Browse files
authored
Add Sendable conformance to DispatchTimer (#2)
1 parent 1ee2999 commit 69c2802

3 files changed

Lines changed: 25 additions & 14 deletions

File tree

Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,12 @@ let package = Package(
1818
targets: [
1919
.target(
2020
name: "DispatchTimer",
21-
dependencies: ["Synchronized"]),
21+
dependencies: ["Synchronized"],
22+
swiftSettings: [
23+
.unsafeFlags([
24+
"-Xfrontend", "-warn-concurrency",
25+
]),
26+
]),
2227
.testTarget(
2328
name: "DispatchTimerTests",
2429
dependencies: ["DispatchTimer"]),

Sources/DispatchTimer/DispatchTimer.swift

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
1-
import Foundation
1+
@preconcurrency import Foundation
22
import Synchronized
33

4-
public class DispatchTimer {
4+
public final class DispatchTimer: Sendable {
55
private let source: DispatchSourceTimer
6-
private let block: () -> Void
7-
private let lock = Lock()
6+
private let block: @Sendable () -> Void
87

98
public let isRepeating: Bool
109

11-
public var nextDeadline: DispatchTime { lock.locked { return _nextDeadline } }
12-
private var _nextDeadline: DispatchTime
10+
public var nextDeadline: DispatchTime {
11+
_nextDeadline.access { $0 }
12+
}
13+
private let _nextDeadline: Locked<DispatchTime>
1314

1415
public init(
1516
_ interval: DispatchTimeInterval,
1617
repeat shouldRepeat: Bool = false,
17-
block: @escaping () -> Void
18+
block: @escaping @Sendable () -> Void
1819
) {
1920
self.source = DispatchSource.makeTimerSource()
2021
self.block = block
2122
self.isRepeating = shouldRepeat
2223

2324
let deadline = DispatchTime.now().advanced(by: interval)
24-
_nextDeadline = deadline
25+
_nextDeadline = Locked(deadline)
2526
let repeating: DispatchTimeInterval = shouldRepeat ? interval : .never
2627
source.schedule(
2728
deadline: deadline,
@@ -34,16 +35,21 @@ public class DispatchTimer {
3435
self.fire()
3536

3637
guard shouldRepeat else { return }
37-
self.lock.locked { self._nextDeadline = DispatchTime.now().advanced(by: interval) }
38+
self._nextDeadline.access {
39+
$0 = DispatchTime.now().advanced(by: interval)
40+
}
3841
}
3942
source.activate()
4043
}
4144

42-
public init(fireAt deadline: DispatchTime, block: @escaping () -> Void) {
45+
public init(
46+
fireAt deadline: DispatchTime,
47+
block: @escaping @Sendable () -> Void
48+
) {
4349
self.source = DispatchSource.makeTimerSource()
4450
self.block = block
4551
self.isRepeating = false
46-
_nextDeadline = deadline
52+
_nextDeadline = Locked(deadline)
4753

4854
let interval = DispatchTime.now().distance(to: deadline)
4955

0 commit comments

Comments
 (0)