Skip to content

[Concurrency] Prevent potential for condfail with owned task executor parameter #74929

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jul 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions include/swift/Basic/Features.def
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ BASELINE_LANGUAGE_FEATURE(BuiltinBuildTaskExecutorRef, 0, "TaskExecutor-building
BASELINE_LANGUAGE_FEATURE(BuiltinBuildExecutor, 0, "Executor-building builtins")
BASELINE_LANGUAGE_FEATURE(BuiltinBuildComplexEqualityExecutor, 0, "Executor-building for 'complexEquality executor' builtins")
BASELINE_LANGUAGE_FEATURE(BuiltinBuildMainExecutor, 0, "MainActor executor building builtin")
BASELINE_LANGUAGE_FEATURE(BuiltinCreateAsyncTaskOwnedTaskExecutor, 0, "Task create with owned TaskExecutor")
BASELINE_LANGUAGE_FEATURE(BuiltinCreateAsyncTaskInGroup, 0, "Task create in task group builtin with extra flags")
BASELINE_LANGUAGE_FEATURE(BuiltinCreateAsyncTaskInGroupWithExecutor, 0, "Task create in task group builtin with extra flags")
BASELINE_LANGUAGE_FEATURE(BuiltinCreateAsyncDiscardingTaskInGroup, 0, "Task create in discarding task group builtin, accounting for the Void return type")
Expand Down
6 changes: 6 additions & 0 deletions stdlib/public/Concurrency/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,12 @@ else()
list(APPEND SWIFT_RUNTIME_CONCURRENCY_C_FLAGS "-fswift-async-fp=never")
endif()

# Do not remove until IsolatedAny is on by default in all supported compilers.
list(APPEND SWIFT_RUNTIME_CONCURRENCY_SWIFT_FLAGS
"-enable-experimental-feature"
"IsolatedAny"
)

list(APPEND SWIFT_RUNTIME_CONCURRENCY_C_FLAGS
"-D__STDC_WANT_LIB_EXT1__=1")

Expand Down
6 changes: 0 additions & 6 deletions stdlib/public/Concurrency/DiscardingTaskGroup.swift
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,6 @@ public struct DiscardingTaskGroup {
/// to set the child task's priority to the priority of the group.
/// - operation: The operation to execute as part of the task group.
@_alwaysEmitIntoClient
@_allowFeatureSuppression(IsolatedAny)
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model", renamed: "addTask(operation:)")
#endif
Expand Down Expand Up @@ -234,7 +233,6 @@ public struct DiscardingTaskGroup {
/// - Returns: `true` if the child task was added to the group;
/// otherwise `false`.
@_alwaysEmitIntoClient
@_allowFeatureSuppression(IsolatedAny)
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model", renamed: "addTask(operation:)")
#endif
Expand Down Expand Up @@ -275,7 +273,6 @@ public struct DiscardingTaskGroup {
}

@_alwaysEmitIntoClient
@_allowFeatureSuppression(IsolatedAny)
public mutating func addTask(
operation: sending @escaping @isolated(any) () async -> Void
) {
Expand Down Expand Up @@ -304,7 +301,6 @@ public struct DiscardingTaskGroup {
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model", renamed: "addTaskUnlessCancelled(operation:)")
#endif
@_allowFeatureSuppression(IsolatedAny)
@_alwaysEmitIntoClient
public mutating func addTaskUnlessCancelled(
operation: sending @escaping @isolated(any) () async -> Void
Expand Down Expand Up @@ -756,7 +752,6 @@ public struct ThrowingDiscardingTaskGroup<Failure: Error> {
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model", renamed: "addTask(operation:)")
#endif
@_alwaysEmitIntoClient
@_allowFeatureSuppression(IsolatedAny)
public mutating func addTask(
priority: TaskPriority? = nil,
operation: sending @escaping @isolated(any) () async throws -> Void
Expand All @@ -781,7 +776,6 @@ public struct ThrowingDiscardingTaskGroup<Failure: Error> {
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model", renamed: "addTask(operation:)")
#endif
@_alwaysEmitIntoClient
@_allowFeatureSuppression(IsolatedAny)
public mutating func addTaskUnlessCancelled(
priority: TaskPriority? = nil,
operation: sending @escaping @isolated(any) () async throws -> Void
Expand Down
33 changes: 28 additions & 5 deletions stdlib/public/Concurrency/Task+TaskExecutor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -236,11 +236,17 @@ extension Task where Failure == Never {
addPendingGroupTaskUnconditionally: false,
isDiscardingTask: false)

#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
let (task, _) = Builtin.createTask(
flags: flags,
initialTaskExecutorConsuming: taskExecutor,
operation: operation)

#else
let executorBuiltin: Builtin.Executor =
taskExecutor.asUnownedTaskExecutor().executor
let (task, _) = Builtin.createAsyncTaskWithExecutor(
flags, executorBuiltin, operation)
#endif
self._task = task
}
}
Expand Down Expand Up @@ -292,11 +298,17 @@ extension Task where Failure == Error {
addPendingGroupTaskUnconditionally: false,
isDiscardingTask: false)

#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
let (task, _) = Builtin.createTask(
flags: flags,
initialTaskExecutorConsuming: taskExecutor,
operation: operation)

#else
let executorBuiltin: Builtin.Executor =
taskExecutor.asUnownedTaskExecutor().executor
let (task, _) = Builtin.createAsyncTaskWithExecutor(
flags, executorBuiltin, operation)
#endif
self._task = task
}
}
Expand Down Expand Up @@ -346,12 +358,17 @@ extension Task where Failure == Never {
addPendingGroupTaskUnconditionally: false,
isDiscardingTask: false)

#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
let (task, _) = Builtin.createTask(
flags: flags,
// initialTaskExecutor: executorBuiltin, deprecated
initialTaskExecutorConsuming: taskExecutor,
operation: operation)

#else
let executorBuiltin: Builtin.Executor =
taskExecutor.asUnownedTaskExecutor().executor
let (task, _) = Builtin.createAsyncTaskWithExecutor(
flags, executorBuiltin, operation)
#endif
return Task(task)
}
}
Expand Down Expand Up @@ -401,11 +418,17 @@ extension Task where Failure == Error {
addPendingGroupTaskUnconditionally: false,
isDiscardingTask: false)

#if $BuiltinCreateAsyncTaskOwnedTaskExecutor
let (task, _) = Builtin.createTask(
flags: flags,
initialTaskExecutorConsuming: taskExecutor,
operation: operation)

#else
let executorBuiltin: Builtin.Executor =
taskExecutor.asUnownedTaskExecutor().executor
let (task, _) = Builtin.createAsyncTaskWithExecutor(
flags, executorBuiltin, operation)
#endif
return Task(task)
}
}
Expand Down
8 changes: 0 additions & 8 deletions stdlib/public/Concurrency/Task.swift
Original file line number Diff line number Diff line change
Expand Up @@ -608,7 +608,6 @@ extension Task where Failure == Never {
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
@discardableResult
@_alwaysEmitIntoClient
@_allowFeatureSuppression(IsolatedAny)
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model")
public init(
priority: TaskPriority? = nil,
Expand Down Expand Up @@ -661,7 +660,6 @@ extension Task where Failure == Never {
/// - operation: The operation to perform.
@discardableResult
@_alwaysEmitIntoClient
@_allowFeatureSuppression(IsolatedAny)
public init(
priority: TaskPriority? = nil,
@_inheritActorContext @_implicitSelfCapture operation: sending @escaping @isolated(any) () async -> Success
Expand Down Expand Up @@ -692,7 +690,6 @@ extension Task where Failure == Error {
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
@discardableResult
@_alwaysEmitIntoClient
@_allowFeatureSuppression(IsolatedAny)
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model")
public init(
priority: TaskPriority? = nil,
Expand Down Expand Up @@ -745,7 +742,6 @@ extension Task where Failure == Error {
/// - operation: The operation to perform.
@discardableResult
@_alwaysEmitIntoClient
@_allowFeatureSuppression(IsolatedAny)
public init(
priority: TaskPriority? = nil,
@_inheritActorContext @_implicitSelfCapture operation: sending @escaping @isolated(any) () async throws -> Success
Expand Down Expand Up @@ -778,7 +774,6 @@ extension Task where Failure == Never {
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
@discardableResult
@_alwaysEmitIntoClient
@_allowFeatureSuppression(IsolatedAny)
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model")
public static func detached(
priority: TaskPriority? = nil,
Expand Down Expand Up @@ -828,7 +823,6 @@ extension Task where Failure == Never {
/// - Returns: A reference to the task.
@discardableResult
@_alwaysEmitIntoClient
@_allowFeatureSuppression(IsolatedAny)
public static func detached(
priority: TaskPriority? = nil,
operation: sending @escaping @isolated(any) () async -> Success
Expand Down Expand Up @@ -859,7 +853,6 @@ extension Task where Failure == Error {
#if SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY
@discardableResult
@_alwaysEmitIntoClient
@_allowFeatureSuppression(IsolatedAny)
@available(*, unavailable, message: "Unavailable in task-to-thread concurrency model")
public static func detached(
priority: TaskPriority? = nil,
Expand Down Expand Up @@ -911,7 +904,6 @@ extension Task where Failure == Error {
/// - Returns: A reference to the task.
@discardableResult
@_alwaysEmitIntoClient
@_allowFeatureSuppression(IsolatedAny)
public static func detached(
priority: TaskPriority? = nil,
operation: sending @escaping @isolated(any) () async throws -> Success
Expand Down
Loading