@@ -46,8 +46,9 @@ public protocol NetworkContextProtocol: AnyObject, Hashable {
4646 init ( identifier: String )
4747 var identifier : String { get }
4848 func activate( )
49- func async ( _ block: @escaping ( ) -> Void )
50- func barrierAsync( _ block: @escaping ( ) -> Void )
49+ func async ( _ block: @Sendable @escaping ( ) -> Void )
50+ func isolatedAsync( _ block: @escaping ( ) -> Void )
51+ func barrierAsync( _ block: @Sendable @escaping ( ) -> Void )
5152}
5253
5354@_spi ( Essentials)
@@ -65,12 +66,17 @@ public final class NetworkContext: NetworkContextProtocol, @unchecked Sendable {
6566 }
6667
6768 public protocol Scheduler : AnyObject {
69+ /// Runs an immediate task, scheduled from the scheduler's context (so the completion is non-sendable).
70+ /// No assumptions are made about how the task is run.
71+ func runImmediateIsolated( _ task: @escaping ( ) -> Void )
72+
6873 /// Runs an immediate task. No assumptions are made about how the task is run.
69- func runImmediate( _ task: @escaping ( ( ) -> Void ) )
74+ func runImmediate( _ task: @Sendable @escaping ( ) -> Void )
75+
7076 /// Schedules a task to run after a delay, using a reference.
7177 ///
7278 /// The `milliseconds` parameter specifies the delay before the task runs.
73- func schedule( _ task: @escaping ( ( ) -> Void ) , milliseconds: Int64 , reference: TimerReference )
79+ func schedule( _ task: @escaping ( ) -> Void , milliseconds: Int64 , reference: TimerReference )
7480 /// Unschedules a task with a reference.
7581 func unschedule( reference: TimerReference )
7682 /// A Boolean value that indicates whether the current code is running in the scheduler.
@@ -301,7 +307,7 @@ extension NetworkContext {
301307 entries. removeFirst ( where: { $0. reference == reference } )
302308 }
303309
304- func insert( targetTime: DispatchTime , reference: TimerReference , task: @escaping ( ( ) -> Void ) ) {
310+ func insert( targetTime: DispatchTime , reference: TimerReference , task: @escaping ( ) -> Void ) {
305311 // First, remove an existing entry for this reference
306312 remove ( by: reference)
307313 // Check to see if the targetTime is before the first entry before it's added
@@ -348,14 +354,19 @@ extension NetworkContext {
348354 init ( globals: Globals ) {
349355 self . globals = globals
350356 }
357+ /// Runs an immediate task, scheduled from the scheduler's context (so the completion is non-sendable).
358+ /// No assumptions are made about how the task is run.
359+ func runImmediateIsolated( _ task: @escaping ( ) -> Void ) {
360+ globals. queue. async ( execute: DispatchWorkItem ( block: task) )
361+ }
351362 /// Runs an immediate task. No assumptions are made about how the task is run.
352- func runImmediate( _ task: @escaping ( ( ) -> Void ) ) {
363+ func runImmediate( _ task: @Sendable @ escaping ( ) -> Void ) {
353364 globals. queue. async ( execute: DispatchWorkItem ( block: task) )
354365 }
355366 /// Schedules a task to run after a delay, using a reference.
356367 ///
357368 /// The `milliseconds` parameter specifies the delay before the task runs.
358- func schedule( _ task: @escaping ( ( ) -> Void ) , milliseconds: Int64 , reference: TimerReference ) {
369+ func schedule( _ task: @escaping ( ) -> Void , milliseconds: Int64 , reference: TimerReference ) {
359370 let targetTime = DispatchTime . now ( ) + DispatchTimeInterval. milliseconds ( Int ( milliseconds) )
360371 globals. timerList. insert ( targetTime: targetTime, reference: reference, task: task)
361372 }
@@ -380,11 +391,18 @@ extension NetworkContext {
380391 globals. queue
381392 }
382393
383- public func async ( _ block: @escaping ( ) -> Void ) {
394+ public func async ( _ block: @Sendable @ escaping ( ) -> Void ) {
384395 scheduler. runImmediate ( block)
385396 }
386397
387- public func barrierAsync( _ block: @escaping ( ) -> Void ) {
398+ public func isolatedAsync( _ block: @escaping ( ) -> Void ) {
399+ #if DEBUG
400+ assert ( )
401+ #endif
402+ scheduler. runImmediateIsolated ( block)
403+ }
404+
405+ public func barrierAsync( _ block: @Sendable @escaping ( ) -> Void ) {
388406 scheduler. runImmediate ( block)
389407 }
390408
0 commit comments