@@ -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