@@ -161,20 +161,29 @@ enum DispatchClockID: CInt {
161
161
@available ( SwiftStdlib 6 . 2 , * )
162
162
extension DispatchExecutorProtocol {
163
163
164
+ func clamp( _ components: ( seconds: Int64 , attoseconds: Int64 ) )
165
+ -> ( seconds: Int64 , attoseconds: Int64 ) {
166
+ if components. seconds < 0
167
+ || components. seconds == 0 && components. attoseconds < 0 {
168
+ return ( seconds: 0 , attoseconds: 0 )
169
+ }
170
+ return ( seconds: components. seconds, attoseconds: components. attoseconds)
171
+ }
172
+
164
173
func timestamp< C: Clock > ( for instant: C . Instant , clock: C )
165
174
-> ( clockID: DispatchClockID , seconds: Int64 , nanoseconds: Int64 ) {
166
175
if clock. traits. contains ( . continuous) {
167
176
let dispatchClock : ContinuousClock = . continuous
168
177
let instant = dispatchClock. convert ( instant: instant, from: clock) !
169
- let ( seconds, attoseconds) = instant. _value. components
178
+ let ( seconds, attoseconds) = clamp ( instant. _value. components)
170
179
let nanoseconds = attoseconds / 1_000_000_000
171
180
return ( clockID: . continuous,
172
181
seconds: Int64 ( seconds) ,
173
182
nanoseconds: Int64 ( nanoseconds) )
174
183
} else {
175
184
let dispatchClock : SuspendingClock = . suspending
176
185
let instant = dispatchClock. convert ( instant: instant, from: clock) !
177
- let ( seconds, attoseconds) = instant. _value. components
186
+ let ( seconds, attoseconds) = clamp ( instant. _value. components)
178
187
let nanoseconds = attoseconds / 1_000_000_000
179
188
return ( clockID: . suspending,
180
189
seconds: Int64 ( seconds) ,
@@ -185,7 +194,7 @@ extension DispatchExecutorProtocol {
185
194
func delay< C: Clock > ( from duration: C . Duration , clock: C )
186
195
-> ( seconds: Int64 , nanoseconds: Int64 ) {
187
196
let swiftDuration = clock. convert ( from: duration) !
188
- let ( seconds, attoseconds) = swiftDuration. components
197
+ let ( seconds, attoseconds) = clamp ( swiftDuration. components)
189
198
let nanoseconds = attoseconds / 1_000_000_000
190
199
return ( seconds: seconds, nanoseconds: nanoseconds)
191
200
}
0 commit comments