@@ -590,45 +590,44 @@ where Base.Element: Sendable, Base: _SendableMetatype, Base.AsyncIterator: _Send
590
590
}
591
591
592
592
func next( isolation actor : isolated ( any Actor ) ? , id: Int ) async throws -> Base . Element ? {
593
- let ( factory, cancelled) = state. withLock { state -> ( ( @Sendable ( ) -> sending Base. AsyncIterator ) ? , Bool ) in
594
- switch state. iteratingTask {
595
- case . pending( let factory) :
596
- state. iteratingTask = . starting
597
- return ( factory, false )
598
- case . cancelled:
599
- return ( nil , true )
600
- default :
601
- return ( nil , false )
602
- }
603
- }
604
- if cancelled { return nil }
605
- if let factory {
606
- let task : Task < Void , Never >
607
- // for the fancy dance of availability and canImport see the comment on the next check for details
608
- #if swift(>=6.2)
609
- if #available( macOS 26 . 0 , iOS 26 . 0 , tvOS 26 . 0 , visionOS 26 . 0 , * ) {
610
- task = Task ( name: " Share Iteration " ) { [ factory, self ] in
611
- await iterationLoop ( factory: factory)
612
- }
613
- } else {
614
- task = Task . detached ( name: " Share Iteration " ) { [ factory, self ] in
615
- await iterationLoop ( factory: factory)
593
+ let iteratingTask = state. withLock { state -> IteratingTask in
594
+ defer {
595
+ if case . pending = state. iteratingTask {
596
+ state. iteratingTask = . starting
597
+ }
616
598
}
599
+ return state. iteratingTask
617
600
}
618
- #else
619
- task = Task . detached { [ factory, self ] in
620
- await iterationLoop ( factory: factory)
621
- }
622
- #endif
623
- // Known Issue: there is a very small race where the task may not get a priority escalation during startup
624
- // this unfortuantely cannot be avoided since the task should ideally not be formed within the critical
625
- // region of the state. Since that could lead to potential deadlocks in low-core-count systems.
626
- // That window is relatively small and can be revisited if a suitable proof of safe behavior can be
627
- // determined.
628
- state. withLock { state in
629
- precondition ( state. iteratingTask. isStarting)
630
- state. iteratingTask = . running( task)
631
- }
601
+
602
+ if case . cancelled = iteratingTask { return nil }
603
+
604
+ if case . pending( let factory) = iteratingTask {
605
+ let task : Task < Void , Never >
606
+ // for the fancy dance of availability and canImport see the comment on the next check for details
607
+ #if swift(>=6.2)
608
+ if #available( macOS 26 . 0 , iOS 26 . 0 , tvOS 26 . 0 , visionOS 26 . 0 , * ) {
609
+ task = Task ( name: " Share Iteration " ) { [ factory, self ] in
610
+ await iterationLoop ( factory: factory)
611
+ }
612
+ } else {
613
+ task = Task . detached ( name: " Share Iteration " ) { [ factory, self ] in
614
+ await iterationLoop ( factory: factory)
615
+ }
616
+ }
617
+ #else
618
+ task = Task . detached { [ factory, self ] in
619
+ await iterationLoop ( factory: factory)
620
+ }
621
+ #endif
622
+ // Known Issue: there is a very small race where the task may not get a priority escalation during startup
623
+ // this unfortuantely cannot be avoided since the task should ideally not be formed within the critical
624
+ // region of the state. Since that could lead to potential deadlocks in low-core-count systems.
625
+ // That window is relatively small and can be revisited if a suitable proof of safe behavior can be
626
+ // determined.
627
+ state. withLock { state in
628
+ precondition ( state. iteratingTask. isStarting)
629
+ state. iteratingTask = . running( task)
630
+ }
632
631
}
633
632
634
633
// withTaskPriorityEscalationHandler is only available for the '26 releases and the 6.2 version of
0 commit comments