Skip to content

Commit 3626000

Browse files
authored
Merge pull request #74929 from ktoso/avoid-condfail-with-owned-taskgroup
[Concurrency] Prevent potential for condfail with owned task executor parameter
2 parents 2c1925d + fb6ab05 commit 3626000

File tree

7 files changed

+127
-35
lines changed

7 files changed

+127
-35
lines changed

include/swift/Basic/Features.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ BASELINE_LANGUAGE_FEATURE(BuiltinBuildTaskExecutorRef, 0, "TaskExecutor-building
150150
BASELINE_LANGUAGE_FEATURE(BuiltinBuildExecutor, 0, "Executor-building builtins")
151151
BASELINE_LANGUAGE_FEATURE(BuiltinBuildComplexEqualityExecutor, 0, "Executor-building for 'complexEquality executor' builtins")
152152
BASELINE_LANGUAGE_FEATURE(BuiltinBuildMainExecutor, 0, "MainActor executor building builtin")
153+
BASELINE_LANGUAGE_FEATURE(BuiltinCreateAsyncTaskOwnedTaskExecutor, 0, "Task create with owned TaskExecutor")
153154
BASELINE_LANGUAGE_FEATURE(BuiltinCreateAsyncTaskInGroup, 0, "Task create in task group builtin with extra flags")
154155
BASELINE_LANGUAGE_FEATURE(BuiltinCreateAsyncTaskInGroupWithExecutor, 0, "Task create in task group builtin with extra flags")
155156
BASELINE_LANGUAGE_FEATURE(BuiltinCreateAsyncDiscardingTaskInGroup, 0, "Task create in discarding task group builtin, accounting for the Void return type")

stdlib/public/Concurrency/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ else()
6060
list(APPEND SWIFT_RUNTIME_CONCURRENCY_C_FLAGS "-fswift-async-fp=never")
6161
endif()
6262

63+
# Do not remove until IsolatedAny is on by default in all supported compilers.
64+
list(APPEND SWIFT_RUNTIME_CONCURRENCY_SWIFT_FLAGS
65+
"-enable-experimental-feature"
66+
"IsolatedAny"
67+
)
68+
6369
list(APPEND SWIFT_RUNTIME_CONCURRENCY_C_FLAGS
6470
"-D__STDC_WANT_LIB_EXT1__=1")
6571

stdlib/public/Concurrency/DiscardingTaskGroup.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,6 @@ public struct DiscardingTaskGroup {
192192
/// to set the child task's priority to the priority of the group.
193193
/// - operation: The operation to execute as part of the task group.
194194
@_alwaysEmitIntoClient
195-
@_allowFeatureSuppression(IsolatedAny)
196195
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
197196
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model", renamed: "addTask(operation:)")
198197
#endif
@@ -234,7 +233,6 @@ public struct DiscardingTaskGroup {
234233
/// - Returns: `true` if the child task was added to the group;
235234
/// otherwise `false`.
236235
@_alwaysEmitIntoClient
237-
@_allowFeatureSuppression(IsolatedAny)
238236
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
239237
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model", renamed: "addTask(operation:)")
240238
#endif
@@ -275,7 +273,6 @@ public struct DiscardingTaskGroup {
275273
}
276274

277275
@_alwaysEmitIntoClient
278-
@_allowFeatureSuppression(IsolatedAny)
279276
public mutating func addTask(
280277
operation: sending @escaping @isolated(any) () async -> Void
281278
) {
@@ -304,7 +301,6 @@ public struct DiscardingTaskGroup {
304301
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
305302
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model", renamed: "addTaskUnlessCancelled(operation:)")
306303
#endif
307-
@_allowFeatureSuppression(IsolatedAny)
308304
@_alwaysEmitIntoClient
309305
public mutating func addTaskUnlessCancelled(
310306
operation: sending @escaping @isolated(any) () async -> Void
@@ -756,7 +752,6 @@ public struct ThrowingDiscardingTaskGroup<Failure: Error> {
756752
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model", renamed: "addTask(operation:)")
757753
#endif
758754
@_alwaysEmitIntoClient
759-
@_allowFeatureSuppression(IsolatedAny)
760755
public mutating func addTask(
761756
priority: TaskPriority? = nil,
762757
operation: sending @escaping @isolated(any) () async throws -> Void
@@ -781,7 +776,6 @@ public struct ThrowingDiscardingTaskGroup<Failure: Error> {
781776
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model", renamed: "addTask(operation:)")
782777
#endif
783778
@_alwaysEmitIntoClient
784-
@_allowFeatureSuppression(IsolatedAny)
785779
public mutating func addTaskUnlessCancelled(
786780
priority: TaskPriority? = nil,
787781
operation: sending @escaping @isolated(any) () async throws -> Void

stdlib/public/Concurrency/Task+TaskExecutor.swift

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -236,11 +236,17 @@ extension Task where Failure == Never {
236236
addPendingGroupTaskUnconditionally: false,
237237
isDiscardingTask: false)
238238

239+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
239240
let (task, _) = Builtin.createTask(
240241
flags: flags,
241242
initialTaskExecutorConsuming: taskExecutor,
242243
operation: operation)
243-
244+
#else
245+
let executorBuiltin: Builtin.Executor =
246+
taskExecutor.asUnownedTaskExecutor().executor
247+
let (task, _) = Builtin.createAsyncTaskWithExecutor(
248+
flags, executorBuiltin, operation)
249+
#endif
244250
self._task = task
245251
}
246252
}
@@ -292,11 +298,17 @@ extension Task where Failure == Error {
292298
addPendingGroupTaskUnconditionally: false,
293299
isDiscardingTask: false)
294300

301+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
295302
let (task, _) = Builtin.createTask(
296303
flags: flags,
297304
initialTaskExecutorConsuming: taskExecutor,
298305
operation: operation)
299-
306+
#else
307+
let executorBuiltin: Builtin.Executor =
308+
taskExecutor.asUnownedTaskExecutor().executor
309+
let (task, _) = Builtin.createAsyncTaskWithExecutor(
310+
flags, executorBuiltin, operation)
311+
#endif
300312
self._task = task
301313
}
302314
}
@@ -346,12 +358,17 @@ extension Task where Failure == Never {
346358
addPendingGroupTaskUnconditionally: false,
347359
isDiscardingTask: false)
348360

361+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
349362
let (task, _) = Builtin.createTask(
350363
flags: flags,
351-
// initialTaskExecutor: executorBuiltin, deprecated
352364
initialTaskExecutorConsuming: taskExecutor,
353365
operation: operation)
354-
366+
#else
367+
let executorBuiltin: Builtin.Executor =
368+
taskExecutor.asUnownedTaskExecutor().executor
369+
let (task, _) = Builtin.createAsyncTaskWithExecutor(
370+
flags, executorBuiltin, operation)
371+
#endif
355372
return Task(task)
356373
}
357374
}
@@ -401,11 +418,17 @@ extension Task where Failure == Error {
401418
addPendingGroupTaskUnconditionally: false,
402419
isDiscardingTask: false)
403420

421+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
404422
let (task, _) = Builtin.createTask(
405423
flags: flags,
406424
initialTaskExecutorConsuming: taskExecutor,
407425
operation: operation)
408-
426+
#else
427+
let executorBuiltin: Builtin.Executor =
428+
taskExecutor.asUnownedTaskExecutor().executor
429+
let (task, _) = Builtin.createAsyncTaskWithExecutor(
430+
flags, executorBuiltin, operation)
431+
#endif
409432
return Task(task)
410433
}
411434
}

stdlib/public/Concurrency/Task.swift

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,6 @@ extension Task where Failure == Never {
608608
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
609609
@discardableResult
610610
@_alwaysEmitIntoClient
611-
@_allowFeatureSuppression(IsolatedAny)
612611
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model")
613612
public init(
614613
priority: TaskPriority? = nil,
@@ -661,7 +660,6 @@ extension Task where Failure == Never {
661660
/// - operation: The operation to perform.
662661
@discardableResult
663662
@_alwaysEmitIntoClient
664-
@_allowFeatureSuppression(IsolatedAny)
665663
public init(
666664
priority: TaskPriority? = nil,
667665
@_inheritActorContext @_implicitSelfCapture operation: sending @escaping @isolated(any) () async -> Success
@@ -692,7 +690,6 @@ extension Task where Failure == Error {
692690
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
693691
@discardableResult
694692
@_alwaysEmitIntoClient
695-
@_allowFeatureSuppression(IsolatedAny)
696693
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model")
697694
public init(
698695
priority: TaskPriority? = nil,
@@ -745,7 +742,6 @@ extension Task where Failure == Error {
745742
/// - operation: The operation to perform.
746743
@discardableResult
747744
@_alwaysEmitIntoClient
748-
@_allowFeatureSuppression(IsolatedAny)
749745
public init(
750746
priority: TaskPriority? = nil,
751747
@_inheritActorContext @_implicitSelfCapture operation: sending @escaping @isolated(any) () async throws -> Success
@@ -778,7 +774,6 @@ extension Task where Failure == Never {
778774
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
779775
@discardableResult
780776
@_alwaysEmitIntoClient
781-
@_allowFeatureSuppression(IsolatedAny)
782777
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model")
783778
public static func detached(
784779
priority: TaskPriority? = nil,
@@ -828,7 +823,6 @@ extension Task where Failure == Never {
828823
/// - Returns: A reference to the task.
829824
@discardableResult
830825
@_alwaysEmitIntoClient
831-
@_allowFeatureSuppression(IsolatedAny)
832826
public static func detached(
833827
priority: TaskPriority? = nil,
834828
operation: sending @escaping @isolated(any) () async -> Success
@@ -859,7 +853,6 @@ extension Task where Failure == Error {
859853
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
860854
@discardableResult
861855
@_alwaysEmitIntoClient
862-
@_allowFeatureSuppression(IsolatedAny)
863856
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model")
864857
public static func detached(
865858
priority: TaskPriority? = nil,
@@ -911,7 +904,6 @@ extension Task where Failure == Error {
911904
/// - Returns: A reference to the task.
912905
@discardableResult
913906
@_alwaysEmitIntoClient
914-
@_allowFeatureSuppression(IsolatedAny)
915907
public static func detached(
916908
priority: TaskPriority? = nil,
917909
operation: sending @escaping @isolated(any) () async throws -> Success

0 commit comments

Comments
 (0)