Skip to content

Commit 42a60d5

Browse files
Use separate queues for stdout,stderr. Append data sync
1 parent d3057e0 commit 42a60d5

File tree

1 file changed

+12
-17
lines changed

1 file changed

+12
-17
lines changed

Sources/SourceKitBazelBSP/SharedUtils/Shell/RunningProcess.swift

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -52,38 +52,33 @@ public struct RunningProcess: Sendable {
5252
public func output<T: DataConvertible>() throws -> T {
5353
var stdoutData: Data = Data()
5454
var stderrData: Data = Data()
55-
let dataQueue = DispatchQueue(label: "\(cmd)")
55+
let stdoutDataQueue = DispatchQueue(label: "Stdout: \(cmd)")
56+
let stderrDataQueue = DispatchQueue(label: "Stderr: \(cmd)")
5657
let group = DispatchGroup()
5758

5859
group.enter()
5960
stdout.fileHandleForReading.readabilityHandler = { stdoutFileHandle in
6061
let tmpstdoutData = stdoutFileHandle.availableData
61-
if !tmpstdoutData.isEmpty {
62-
// Ensure we always wait for all reads
63-
group.enter()
64-
dataQueue.async {
65-
stdoutData.append(tmpstdoutData)
66-
group.leave()
67-
}
68-
} else { // EOF
62+
if tmpstdoutData.isEmpty { // EOF
6963
stdout.fileHandleForReading.readabilityHandler = nil
7064
group.leave()
65+
} else {
66+
stdoutDataQueue.sync {
67+
stdoutData.append(tmpstdoutData)
68+
}
7169
}
7270
}
7371

7472
group.enter()
7573
stderr.fileHandleForReading.readabilityHandler = { stderrFileHandle in
7674
let tmpstderrData = stderrFileHandle.availableData
77-
if !tmpstderrData.isEmpty {
78-
// Ensure we always wait for all reads
79-
group.enter()
80-
dataQueue.async {
81-
stderrData.append(tmpstderrData)
82-
group.leave()
83-
}
84-
} else { // EOF
75+
if tmpstderrData.isEmpty { // EOF
8576
stderr.fileHandleForReading.readabilityHandler = nil
8677
group.leave()
78+
} else {
79+
stderrDataQueue.sync {
80+
stderrData.append(tmpstderrData)
81+
}
8782
}
8883
}
8984

0 commit comments

Comments
 (0)