Skip to content

Commit 814488f

Browse files
authored
Merge pull request #64050 from ktoso/wip-continuation-docs-fix
[Concurrency] Fix continuation documentation about execution semantics
2 parents 6d2827b + c446f4c commit 814488f

File tree

2 files changed

+84
-19
lines changed

2 files changed

+84
-19
lines changed

stdlib/public/Concurrency/CheckedContinuation.swift

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -252,15 +252,32 @@ extension CheckedContinuation {
252252
}
253253
}
254254

255-
/// Suspends the current task,
256-
/// then calls the given closure with a checked continuation for the current task.
255+
/// Invokes the passed in closure with a checked continuation for the current task.
256+
///
257+
/// The body of the closure executes synchronously on the calling task, and once it returns
258+
/// the calling task is suspended. It is possible to immediately resume the task, or escape the
259+
/// continuation in order to complete it afterwards, which will them resume suspended task.
260+
///
261+
/// You must invoke the continuation's `resume` method exactly once.
262+
///
263+
/// Missing to invoke it (eventually) will cause the calling task to remain suspended
264+
/// indefinitely which will result in the task "hanging" as well as being leaked with
265+
/// no possibility to destroy it.
266+
///
267+
/// The checked continuation offers detection of mis-use, and dropping the last reference
268+
/// to it, without having resumed it will trigger a warning. Resuming a continuation twice
269+
/// is also diagnosed and will cause a crash.
257270
///
258271
/// - Parameters:
259272
/// - function: A string identifying the declaration that is the notional
260273
/// source for the continuation, used to identify the continuation in
261274
/// runtime diagnostics related to misuse of this continuation.
262275
/// - body: A closure that takes a `CheckedContinuation` parameter.
263-
/// You must resume the continuation exactly once.
276+
/// - Returns: The value continuation is resumed with.
277+
///
278+
/// - SeeAlso: `withCheckedThrowingContinuation(function:_:)`
279+
/// - SeeAlso: `withUnsafeContinuation(function:_:)`
280+
/// - SeeAlso: `withUnsafeThrowingContinuation(function:_:)`
264281
@available(SwiftStdlib 5.1, *)
265282
@_unsafeInheritExecutor // ABI compatibility with Swift 5.1
266283
@inlinable
@@ -273,18 +290,34 @@ public func withCheckedContinuation<T>(
273290
}
274291
}
275292

276-
/// Suspends the current task,
277-
/// then calls the given closure with a checked throwing continuation for the current task.
293+
/// Invokes the passed in closure with a checked continuation for the current task.
294+
///
295+
/// The body of the closure executes synchronously on the calling task, and once it returns
296+
/// the calling task is suspended. It is possible to immediately resume the task, or escape the
297+
/// continuation in order to complete it afterwards, which will them resume suspended task.
298+
///
299+
/// If `resume(throwing:)` is called on the continuation, this function throws that error.
300+
///
301+
/// You must invoke the continuation's `resume` method exactly once.
302+
///
303+
/// Missing to invoke it (eventually) will cause the calling task to remain suspended
304+
/// indefinitely which will result in the task "hanging" as well as being leaked with
305+
/// no possibility to destroy it.
306+
///
307+
/// The checked continuation offers detection of mis-use, and dropping the last reference
308+
/// to it, without having resumed it will trigger a warning. Resuming a continuation twice
309+
/// is also diagnosed and will cause a crash.
278310
///
279311
/// - Parameters:
280312
/// - function: A string identifying the declaration that is the notional
281313
/// source for the continuation, used to identify the continuation in
282314
/// runtime diagnostics related to misuse of this continuation.
283315
/// - body: A closure that takes a `CheckedContinuation` parameter.
284-
/// You must resume the continuation exactly once.
316+
/// - Returns: The value continuation is resumed with.
285317
///
286-
/// If `resume(throwing:)` is called on the continuation,
287-
/// this function throws that error.
318+
/// - SeeAlso: `withCheckedContinuation(function:_:)`
319+
/// - SeeAlso: `withUnsafeContinuation(function:_:)`
320+
/// - SeeAlso: `withUnsafeThrowingContinuation(function:_:)`
288321
@available(SwiftStdlib 5.1, *)
289322
@_unsafeInheritExecutor // ABI compatibility with Swift 5.1
290323
@inlinable

stdlib/public/Concurrency/PartialAsyncTask.swift

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -293,13 +293,30 @@ internal func _resumeUnsafeThrowingContinuationWithError<T>(
293293

294294
#endif
295295

296-
/// Suspends the current task,
297-
/// then calls the given closure with an unsafe continuation for the current task.
296+
297+
/// Invokes the passed in closure with a unsafe continuation for the current task.
298+
///
299+
/// The body of the closure executes synchronously on the calling task, and once it returns
300+
/// the calling task is suspended. It is possible to immediately resume the task, or escape the
301+
/// continuation in order to complete it afterwards, which will them resume suspended task.
302+
///
303+
/// You must invoke the continuation's `resume` method exactly once.
304+
///
305+
/// Missing to invoke it (eventually) will cause the calling task to remain suspended
306+
/// indefinitely which will result in the task "hanging" as well as being leaked with
307+
/// no possibility to destroy it.
308+
///
309+
/// Unlike the "checked" continuation variant, the `UnsafeContinuation` does not
310+
/// detect or diagnose any kind of misuse, so you need to be extra careful to avoid
311+
/// calling `resume` twice or forgetting to call resume before letting go of the
312+
/// continuation object.
298313
///
299314
/// - Parameter fn: A closure that takes an `UnsafeContinuation` parameter.
300-
/// You must resume the continuation exactly once.
315+
/// - Returns: The value continuation is resumed with.
301316
///
302-
/// - Returns: The value passed to the continuation by the closure.
317+
/// - SeeAlso: `withUnsafeThrowingContinuation(function:_:)`
318+
/// - SeeAlso: `withCheckedContinuation(function:_:)`
319+
/// - SeeAlso: `withCheckedThrowingContinuation(function:_:)`
303320
@available(SwiftStdlib 5.1, *)
304321
@_unsafeInheritExecutor
305322
@_alwaysEmitIntoClient
@@ -311,16 +328,31 @@ public func withUnsafeContinuation<T>(
311328
}
312329
}
313330

314-
/// Suspends the current task,
315-
/// then calls the given closure with an unsafe throwing continuation for the current task.
331+
/// Invokes the passed in closure with a unsafe continuation for the current task.
316332
///
317-
/// - Parameter fn: A closure that takes an `UnsafeContinuation` parameter.
318-
/// You must resume the continuation exactly once.
333+
/// The body of the closure executes synchronously on the calling task, and once it returns
334+
/// the calling task is suspended. It is possible to immediately resume the task, or escape the
335+
/// continuation in order to complete it afterwards, which will them resume suspended task.
319336
///
320-
/// - Returns: The value passed to the continuation by the closure.
337+
/// If `resume(throwing:)` is called on the continuation, this function throws that error.
338+
///
339+
/// You must invoke the continuation's `resume` method exactly once.
340+
///
341+
/// Missing to invoke it (eventually) will cause the calling task to remain suspended
342+
/// indefinitely which will result in the task "hanging" as well as being leaked with
343+
/// no possibility to destroy it.
344+
///
345+
/// Unlike the "checked" continuation variant, the `UnsafeContinuation` does not
346+
/// detect or diagnose any kind of misuse, so you need to be extra careful to avoid
347+
/// calling `resume` twice or forgetting to call resume before letting go of the
348+
/// continuation object.
349+
///
350+
/// - Parameter fn: A closure that takes an `UnsafeContinuation` parameter.
351+
/// - Returns: The value continuation is resumed with.
321352
///
322-
/// If `resume(throwing:)` is called on the continuation,
323-
/// this function throws that error.
353+
/// - SeeAlso: `withUnsafeContinuation(function:_:)`
354+
/// - SeeAlso: `withCheckedContinuation(function:_:)`
355+
/// - SeeAlso: `withCheckedThrowingContinuation(function:_:)`
324356
@available(SwiftStdlib 5.1, *)
325357
@_unsafeInheritExecutor
326358
@_alwaysEmitIntoClient

0 commit comments

Comments
 (0)