-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathSpawnCmdStatusProcess.swift
More file actions
55 lines (45 loc) · 1.51 KB
/
SpawnCmdStatusProcess.swift
File metadata and controls
55 lines (45 loc) · 1.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//
// SpawnCmdStatusProcess.swift
//
//
// Created by Danny Sung on 05/17/2022.
//
import Foundation
public class SpawnCmdStatusProcess: SpawnCmdStatus {
public let process: Process
private let fileHandlePairs: [FileHandlePair]
private var terminationStatus: Int?
// Note: Even thoguh we do not use `fileHandlePairs`, we must retain them here until the process terminates otherwise their handlers will not be called.
init(process: Process, fileHandlePairs: [FileHandlePair] = []) {
self.process = process
self.fileHandlePairs = fileHandlePairs
}
public var isRunning: Bool {
self.process.isRunning
}
public var didFinishRunning: Bool {
!self.process.isRunning
}
public var exitStatus: Int? {
guard self.didFinishRunning else { return nil }
return Int(self.process.terminationStatus)
}
public func exitStatus() async -> Int {
if let terminationStatus = terminationStatus {
return terminationStatus
}
return await withCheckedContinuation { continuation in
let exitStatus = self.wait()
continuation.resume(returning: exitStatus)
}
}
public func wait() -> Int {
if let terminationStatus = terminationStatus {
return terminationStatus
}
self.process.waitUntilExit()
let terminationStatus = Int(self.process.terminationStatus)
self.terminationStatus = terminationStatus
return terminationStatus
}
}