field_ios

In-the-field app for Radroots on iOS
git clone https://radroots.dev/git/field_ios.git
Log | Files | Refs | README | LICENSE

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 }