TeraRuntimeShutdownTask.swift (1416B)
1 import Foundation 2 3 struct TeraRuntimeShutdownWork: Sendable { 4 let backend: (any TeraRuntimeBackend)? 5 let drains: [@Sendable () async throws -> Void] 6 7 func close() async -> Result<TeraRuntimeShutdownReceipt, TeraRuntimeFailure> { 8 do { 9 for drain in drains { 10 try await drain() 11 } 12 guard let backend else { return .success(.alreadyStopped) } 13 return try await .success(backend.shutdown()) 14 } catch { 15 return .failure(TeraRuntimeClient.failure(from: error, operation: "runtime.shutdown")) 16 } 17 } 18 } 19 20 /// One retained shutdown operation; each caller has a bounded wait. Cancelling 21 /// or timing out a wait never cancels this owner or starts another close. 22 final class TeraRuntimeShutdownTask: Sendable { 23 private let task: Task<Result<TeraRuntimeShutdownReceipt, TeraRuntimeFailure>, Never> 24 private let deadline: UInt64 25 26 init( 27 work: TeraRuntimeShutdownWork, 28 deadline: UInt64, 29 completed: @escaping @Sendable (Result<TeraRuntimeShutdownReceipt, TeraRuntimeFailure>) async -> Void 30 ) { 31 self.deadline = deadline 32 task = Task { 33 let result = await work.close() 34 await completed(result) 35 return result 36 } 37 } 38 39 func value() async -> TeraRuntimeBoundedOutcome<TeraRuntimeShutdownReceipt> { 40 let wait = TeraRuntimeBoundedTask(deadlineNanoseconds: deadline) { [task] in 41 await task.value 42 } 43 return await wait.value() 44 } 45 }