diff --git a/Sources/ServiceLifecycle/GracefulShutdown.swift b/Sources/ServiceLifecycle/GracefulShutdown.swift index 76b8838..080d0f5 100644 --- a/Sources/ServiceLifecycle/GracefulShutdown.swift +++ b/Sources/ServiceLifecycle/GracefulShutdown.swift @@ -74,42 +74,44 @@ enum ValueOrGracefulShutdown: Sendable { /// Cancels the closure when a graceful shutdown was triggered. /// /// - Parameter operation: The actual operation. -public func cancelOnGracefulShutdown(_ operation: @Sendable @escaping () async throws -> T) async rethrows -> T? { - return try await withThrowingTaskGroup(of: ValueOrGracefulShutdown.self) { group in - group.addTask { - let value = try await operation() - return .value(value) - } - - group.addTask { - for try await _ in AsyncGracefulShutdownSequence() { - return .gracefulShutdown - } - - throw CancellationError() - } - - let result = try await group.next() - group.cancelAll() - - switch result { - case .value(let t): - return t - case .gracefulShutdown: - switch try await group.next() { - case .value(let t): - return t - case .gracefulShutdown: - fatalError("Unexpectedly got gracefulShutdown from group.next()") - - case nil: - fatalError("Unexpectedly got nil from group.next()") - } - - case nil: - fatalError("Unexpectedly got nil from group.next()") - } - } +public func cancelOnGracefulShutdown(_ operation: @Sendable () async throws -> T) async rethrows -> T? { + return try await withoutActuallyEscaping(operation, do: { operationEscaping in + return try await withThrowingTaskGroup(of: ValueOrGracefulShutdown.self) { group in + group.addTask { + let value = try await operationEscaping() + return .value(value) + } + + group.addTask { + for try await _ in AsyncGracefulShutdownSequence() { + return .gracefulShutdown + } + + throw CancellationError() + } + + let result = try await group.next() + group.cancelAll() + + switch result { + case .value(let t): + return t + case .gracefulShutdown: + switch try await group.next() { + case .value(let t): + return t + case .gracefulShutdown: + fatalError("Unexpectedly got gracefulShutdown from group.next()") + + case nil: + fatalError("Unexpectedly got nil from group.next()") + } + + case nil: + fatalError("Unexpectedly got nil from group.next()") + } + } + }) } extension Task where Success == Never, Failure == Never {