Skip to content

Commit d3057e0

Browse files
Fix all tests by ensuring we wait for all reads and EOF
1 parent 4372694 commit d3057e0

File tree

1 file changed

+23
-17
lines changed

1 file changed

+23
-17
lines changed

Sources/SourceKitBazelBSP/SharedUtils/Shell/RunningProcess.swift

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -53,37 +53,43 @@ public struct RunningProcess: Sendable {
5353
var stdoutData: Data = Data()
5454
var stderrData: Data = Data()
5555
let dataQueue = DispatchQueue(label: "\(cmd)")
56-
let dispatchGroup = DispatchGroup()
56+
let group = DispatchGroup()
5757

58-
dispatchGroup.enter()
58+
group.enter()
5959
stdout.fileHandleForReading.readabilityHandler = { stdoutFileHandle in
60-
let outData = stdoutFileHandle.availableData
61-
if outData.isEmpty {
62-
stdoutFileHandle.readabilityHandler = nil
63-
dispatchGroup.leave()
64-
} else {
60+
let tmpstdoutData = stdoutFileHandle.availableData
61+
if !tmpstdoutData.isEmpty {
62+
// Ensure we always wait for all reads
63+
group.enter()
6564
dataQueue.async {
66-
stdoutData.append(outData)
65+
stdoutData.append(tmpstdoutData)
66+
group.leave()
6767
}
68+
} else { // EOF
69+
stdout.fileHandleForReading.readabilityHandler = nil
70+
group.leave()
6871
}
6972
}
7073

71-
dispatchGroup.enter()
74+
group.enter()
7275
stderr.fileHandleForReading.readabilityHandler = { stderrFileHandle in
73-
let outData = stderrFileHandle.availableData
74-
if outData.isEmpty {
75-
stderrFileHandle.readabilityHandler = nil
76-
dispatchGroup.leave()
77-
} else {
76+
let tmpstderrData = stderrFileHandle.availableData
77+
if !tmpstderrData.isEmpty {
78+
// Ensure we always wait for all reads
79+
group.enter()
7880
dataQueue.async {
79-
stderrData.append(outData)
81+
stderrData.append(tmpstderrData)
82+
group.leave()
8083
}
84+
} else { // EOF
85+
stderr.fileHandleForReading.readabilityHandler = nil
86+
group.leave()
8187
}
8288
}
8389

8490
wrappedProcess.waitUntilExit()
85-
dispatchGroup.wait()
86-
91+
group.wait()
92+
8793
guard wrappedProcess.terminationStatus == 0 else {
8894
logger.debug("Command failed: \(cmd)")
8995
let stderrString: String = String(data: stderrData, encoding: .utf8) ?? "(no stderr)"

0 commit comments

Comments
 (0)