Skip to content

Commit f97be93

Browse files
committed
fix: crash when changing refresh interval (task already launched)
Process cannot be reused after termination. Now creates a new Process instance each time run() is called, with its own Pipe for output.
1 parent f17edb3 commit f97be93

1 file changed

Lines changed: 21 additions & 22 deletions

File tree

NetworkStatusBar/NetworkStatus.swift

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,50 +26,49 @@ open class NetworkDetails {
2626
var callback: (NetworkStates) -> Void = { _ in }
2727

2828
var laststate: DataFrame = DataFrame()
29-
var process: Process = Process()
29+
var process: Process?
3030
private let lock = NSLock()
3131

32-
init() {
33-
self.prepare()
34-
}
35-
3632
let ColumnName = "name"
3733
let ColumnBytesIn = "bytes_in"
3834
let ColumnBytesOut = "bytes_out"
3935
let ColumnBytesTotal = "bytes_total"
4036
let Columns = ["", "bytes_in", "bytes_out"]
4137

42-
func prepare() {
43-
process.executableURL = URL.init(fileURLWithPath: "/usr/bin/nettop")
38+
func run(refreshSeconds: Int = 1) {
39+
stop()
40+
41+
let proc = Process()
42+
proc.executableURL = URL(fileURLWithPath: "/usr/bin/nettop")
43+
proc.arguments = ["-P", "-L", "0", "-s", "\(refreshSeconds)"]
44+
4445
let pipe = Pipe()
45-
process.standardOutput = pipe
46-
process.standardError = pipe
47-
process.standardInput = Pipe()
48-
Task {
46+
proc.standardOutput = pipe
47+
proc.standardError = pipe
48+
proc.standardInput = Pipe()
49+
50+
Task { [weak self] in
4951
var data = Data()
5052
for try await line in pipe.fileHandleForReading.bytes.lines {
5153
if line.hasPrefix("time") {
52-
self.update(data: data)
54+
self?.update(data: data)
5355
data = Data()
5456
}
5557
data.append(contentsOf: (line + "\n").utf8)
5658
}
5759
}
58-
}
5960

60-
func run(refreshSeconds: Int = 1) {
61-
if process.isRunning {
62-
process.terminate()
63-
}
64-
process.arguments = ["-P", "-L", "0", "-s", "\(refreshSeconds)"]
65-
try? process.run()
66-
process.waitUntilExit()
61+
self.process = proc
62+
try? proc.run()
63+
proc.waitUntilExit()
6764
}
6865

6966
func stop() {
70-
if process.isRunning {
71-
process.terminate()
67+
if let proc = process, proc.isRunning {
68+
proc.terminate()
69+
proc.waitUntilExit()
7270
}
71+
process = nil
7372
}
7473

7574
func update(data: Data) {

0 commit comments

Comments
 (0)