Skip to content

Commit 3107100

Browse files
authored
Merge pull request #74939 from ktoso/pick-avoid-condfail-with-owned-taskgroup
[6.0] Prevent potential for condfail with owned task executor parameter
2 parents fa5ec94 + d357be9 commit 3107100

File tree

7 files changed

+127
-115
lines changed

7 files changed

+127
-115
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 @@ LANGUAGE_FEATURE(BuiltinBuildTaskExecutorRef, 0, "TaskExecutor-building builtins
150150
BASELINE_LANGUAGE_FEATURE(BuiltinBuildExecutor, 0, "Executor-building builtins")
151151
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
LANGUAGE_FEATURE(BuiltinCreateAsyncTaskInGroupWithExecutor, 0, "Task create in task group builtin with extra flags")
155156
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
@@ -200,7 +200,6 @@ public struct DiscardingTaskGroup {
200200
/// to set the child task's priority to the priority of the group.
201201
/// - operation: The operation to execute as part of the task group.
202202
@_alwaysEmitIntoClient
203-
@_allowFeatureSuppression(IsolatedAny)
204203
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
205204
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model", renamed: "addTask(operation:)")
206205
#endif
@@ -257,7 +256,6 @@ public struct DiscardingTaskGroup {
257256
/// - Returns: `true` if the child task was added to the group;
258257
/// otherwise `false`.
259258
@_alwaysEmitIntoClient
260-
@_allowFeatureSuppression(IsolatedAny)
261259
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
262260
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model", renamed: "addTask(operation:)")
263261
#endif
@@ -313,7 +311,6 @@ public struct DiscardingTaskGroup {
313311
}
314312

315313
@_alwaysEmitIntoClient
316-
@_allowFeatureSuppression(IsolatedAny)
317314
public mutating func addTask(
318315
operation: sending @escaping @isolated(any) () async -> Void
319316
) {
@@ -357,7 +354,6 @@ public struct DiscardingTaskGroup {
357354
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
358355
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model", renamed: "addTaskUnlessCancelled(operation:)")
359356
#endif
360-
@_allowFeatureSuppression(IsolatedAny)
361357
@_alwaysEmitIntoClient
362358
public mutating func addTaskUnlessCancelled(
363359
operation: sending @escaping @isolated(any) () async -> Void
@@ -892,7 +888,6 @@ public struct ThrowingDiscardingTaskGroup<Failure: Error> {
892888
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model", renamed: "addTask(operation:)")
893889
#endif
894890
@_alwaysEmitIntoClient
895-
@_allowFeatureSuppression(IsolatedAny)
896891
public mutating func addTask(
897892
priority: TaskPriority? = nil,
898893
operation: sending @escaping @isolated(any) () async throws -> Void
@@ -936,7 +931,6 @@ public struct ThrowingDiscardingTaskGroup<Failure: Error> {
936931
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model", renamed: "addTask(operation:)")
937932
#endif
938933
@_alwaysEmitIntoClient
939-
@_allowFeatureSuppression(IsolatedAny)
940934
public mutating func addTaskUnlessCancelled(
941935
priority: TaskPriority? = nil,
942936
operation: sending @escaping @isolated(any) () async throws -> Void

stdlib/public/Concurrency/Task+TaskExecutor.swift

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -229,23 +229,25 @@ extension Task where Failure == Never {
229229
self = Self.init(priority: priority, operation: operation)
230230
return
231231
}
232-
#if $BuiltinCreateAsyncTaskWithExecutor && $BuiltinCreateTask
233232
// Set up the job flags for a new task.
234233
let flags = taskCreateFlags(
235234
priority: priority, isChildTask: false, copyTaskLocals: true,
236235
inheritContext: true, enqueueJob: true,
237236
addPendingGroupTaskUnconditionally: false,
238237
isDiscardingTask: false)
239238

239+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
240240
let (task, _) = Builtin.createTask(
241241
flags: flags,
242242
initialTaskExecutorConsuming: taskExecutor,
243243
operation: operation)
244-
244+
#else
245+
let executorBuiltin: Builtin.Executor =
246+
taskExecutor.asUnownedTaskExecutor().executor
247+
let (task, _) = Builtin.createAsyncTaskWithExecutor(
248+
flags, executorBuiltin, operation)
249+
#endif
245250
self._task = task
246-
#else
247-
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskWithExecutor or $BuiltinCreateTask")
248-
#endif
249251
}
250252
}
251253

@@ -289,23 +291,25 @@ extension Task where Failure == Error {
289291
self = Self.init(priority: priority, operation: operation)
290292
return
291293
}
292-
#if $BuiltinCreateAsyncTaskWithExecutor && $BuiltinCreateTask
293294
// Set up the job flags for a new task.
294295
let flags = taskCreateFlags(
295296
priority: priority, isChildTask: false, copyTaskLocals: true,
296297
inheritContext: true, enqueueJob: true,
297298
addPendingGroupTaskUnconditionally: false,
298299
isDiscardingTask: false)
299300

301+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
300302
let (task, _) = Builtin.createTask(
301303
flags: flags,
302304
initialTaskExecutorConsuming: taskExecutor,
303305
operation: operation)
304-
306+
#else
307+
let executorBuiltin: Builtin.Executor =
308+
taskExecutor.asUnownedTaskExecutor().executor
309+
let (task, _) = Builtin.createAsyncTaskWithExecutor(
310+
flags, executorBuiltin, operation)
311+
#endif
305312
self._task = task
306-
#else
307-
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskWithExecutor or $BuiltinCreateTask")
308-
#endif
309313
}
310314
}
311315

@@ -347,24 +351,25 @@ extension Task where Failure == Never {
347351
guard let taskExecutor else {
348352
return Self.detached(priority: priority, operation: operation)
349353
}
350-
#if $BuiltinCreateAsyncTaskWithExecutor && $BuiltinCreateTask
351354
// Set up the job flags for a new task.
352355
let flags = taskCreateFlags(
353356
priority: priority, isChildTask: false, copyTaskLocals: false,
354357
inheritContext: false, enqueueJob: true,
355358
addPendingGroupTaskUnconditionally: false,
356359
isDiscardingTask: false)
357360

361+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
358362
let (task, _) = Builtin.createTask(
359363
flags: flags,
360-
// initialTaskExecutor: executorBuiltin, deprecated
361364
initialTaskExecutorConsuming: taskExecutor,
362365
operation: operation)
363-
366+
#else
367+
let executorBuiltin: Builtin.Executor =
368+
taskExecutor.asUnownedTaskExecutor().executor
369+
let (task, _) = Builtin.createAsyncTaskWithExecutor(
370+
flags, executorBuiltin, operation)
371+
#endif
364372
return Task(task)
365-
#else
366-
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskWithExecutor or $BuiltinCreateTask")
367-
#endif
368373
}
369374
}
370375

@@ -406,23 +411,25 @@ extension Task where Failure == Error {
406411
guard let taskExecutor else {
407412
return Self.detached(priority: priority, operation: operation)
408413
}
409-
#if $BuiltinCreateAsyncTaskWithExecutor && $BuiltinCreateTask
410414
// Set up the job flags for a new task.
411415
let flags = taskCreateFlags(
412416
priority: priority, isChildTask: false, copyTaskLocals: false,
413417
inheritContext: false, enqueueJob: true,
414418
addPendingGroupTaskUnconditionally: false,
415419
isDiscardingTask: false)
416420

421+
#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
417422
let (task, _) = Builtin.createTask(
418423
flags: flags,
419424
initialTaskExecutorConsuming: taskExecutor,
420425
operation: operation)
421-
426+
#else
427+
let executorBuiltin: Builtin.Executor =
428+
taskExecutor.asUnownedTaskExecutor().executor
429+
let (task, _) = Builtin.createAsyncTaskWithExecutor(
430+
flags, executorBuiltin, operation)
431+
#endif
422432
return Task(task)
423-
#else
424-
fatalError("Unsupported Swift compiler, missing support for BuiltinCreateAsyncTaskWithExecutor or $BuiltinCreateTask")
425-
#endif
426433
}
427434
}
428435

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,
@@ -665,7 +664,6 @@ extension Task where Failure == Never {
665664
/// - operation: The operation to perform.
666665
@discardableResult
667666
@_alwaysEmitIntoClient
668-
@_allowFeatureSuppression(IsolatedAny)
669667
public init(
670668
priority: TaskPriority? = nil,
671669
@_inheritActorContext @_implicitSelfCapture operation: sending @escaping @isolated(any) () async -> Success
@@ -704,7 +702,6 @@ extension Task where Failure == Error {
704702
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
705703
@discardableResult
706704
@_alwaysEmitIntoClient
707-
@_allowFeatureSuppression(IsolatedAny)
708705
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model")
709706
public init(
710707
priority: TaskPriority? = nil,
@@ -761,7 +758,6 @@ extension Task where Failure == Error {
761758
/// - operation: The operation to perform.
762759
@discardableResult
763760
@_alwaysEmitIntoClient
764-
@_allowFeatureSuppression(IsolatedAny)
765761
public init(
766762
priority: TaskPriority? = nil,
767763
@_inheritActorContext @_implicitSelfCapture operation: sending @escaping @isolated(any) () async throws -> Success
@@ -802,7 +798,6 @@ extension Task where Failure == Never {
802798
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
803799
@discardableResult
804800
@_alwaysEmitIntoClient
805-
@_allowFeatureSuppression(IsolatedAny)
806801
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model")
807802
public static func detached(
808803
priority: TaskPriority? = nil,
@@ -856,7 +851,6 @@ extension Task where Failure == Never {
856851
/// - Returns: A reference to the task.
857852
@discardableResult
858853
@_alwaysEmitIntoClient
859-
@_allowFeatureSuppression(IsolatedAny)
860854
public static func detached(
861855
priority: TaskPriority? = nil,
862856
operation: sending @escaping @isolated(any) () async -> Success
@@ -895,7 +889,6 @@ extension Task where Failure == Error {
895889
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
896890
@discardableResult
897891
@_alwaysEmitIntoClient
898-
@_allowFeatureSuppression(IsolatedAny)
899892
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model")
900893
public static func detached(
901894
priority: TaskPriority? = nil,
@@ -951,7 +944,6 @@ extension Task where Failure == Error {
951944
/// - Returns: A reference to the task.
952945
@discardableResult
953946
@_alwaysEmitIntoClient
954-
@_allowFeatureSuppression(IsolatedAny)
955947
public static func detached(
956948
priority: TaskPriority? = nil,
957949
operation: sending @escaping @isolated(any) () async throws -> Success

0 commit comments

Comments
 (0)