@@ -110,27 +110,32 @@ public func run<
110110 error: try error. createPipe ( )
111111 ) { execution, inputIO, outputIO, errorIO in
112112 // Write input, capture output and error in parallel
113+ var inputIOBox : TrackedPlatformDiskIO ? = consume inputIO
114+ var outputIOBox : TrackedPlatformDiskIO ? = consume outputIO
115+ var errorIOBox : TrackedPlatformDiskIO ? = consume errorIO
113116 return try await withThrowingTaskGroup (
114117 of: OutputCapturingState < Output . OutputType , Error . OutputType > . self,
115118 returning: RunResult . self
116119 ) { group in
120+ var outputIOContainer : TrackedPlatformDiskIO ? = outputIOBox. take ( )
121+ var errorIOContainer : TrackedPlatformDiskIO ? = errorIOBox. take ( )
117122 group. addTask {
118123 let stdout = try await output. captureOutput (
119- from: outputIO
124+ from: outputIOContainer . take ( )
120125 )
121126 return . standardOutputCaptured( stdout)
122127 }
123128 group. addTask {
124129 let stderr = try await error. captureOutput (
125- from: errorIO
130+ from: errorIOContainer . take ( )
126131 )
127132 return . standardErrorCaptured( stderr)
128133 }
129134
130135 // Write span at the same isolation
131- if let writeFd = inputIO {
136+ if let writeFd = inputIOBox . take ( ) {
132137 let writer = StandardInputWriter ( diskIO: writeFd)
133- _ = try await writer. write ( input. bytes )
138+ _ = try await writer. write ( input. _bytes )
134139 try await writer. finish ( )
135140 }
136141
@@ -207,20 +212,23 @@ public func run<Result, Input: InputProtocol, Error: OutputProtocol>(
207212 output: try output. createPipe ( ) ,
208213 error: try error. createPipe ( )
209214 ) { execution, inputIO, outputIO, errorIO in
215+ var inputIOBox : TrackedPlatformDiskIO ? = consume inputIO
216+ var outputIOBox : TrackedPlatformDiskIO ? = consume outputIO
210217 return try await withThrowingTaskGroup (
211218 of: Void . self,
212219 returning: Result . self
213220 ) { group in
221+ var inputIOContainer : TrackedPlatformDiskIO ? = inputIOBox. take ( )
214222 group. addTask {
215- if let inputIO = inputIO {
223+ if let inputIO = inputIOContainer . take ( ) {
216224 let writer = StandardInputWriter ( diskIO: inputIO)
217225 try await input. write ( with: writer)
218226 try await writer. finish ( )
219227 }
220228 }
221229
222230 // Body runs in the same isolation
223- let outputSequence = AsyncBufferSequence ( diskIO: outputIO! )
231+ let outputSequence = AsyncBufferSequence ( diskIO: outputIOBox . take ( ) ! . consumeDiskIO ( ) )
224232 let result = try await body ( execution, outputSequence)
225233 try await group. waitForAll ( )
226234 return result
@@ -254,20 +262,23 @@ public func run<Result, Input: InputProtocol, Output: OutputProtocol>(
254262 output: try output. createPipe ( ) ,
255263 error: try error. createPipe ( )
256264 ) { execution, inputIO, outputIO, errorIO in
265+ var inputIOBox : TrackedPlatformDiskIO ? = consume inputIO
266+ var errorIOBox : TrackedPlatformDiskIO ? = consume errorIO
257267 return try await withThrowingTaskGroup (
258268 of: Void . self,
259269 returning: Result . self
260270 ) { group in
271+ var inputIOContainer : TrackedPlatformDiskIO ? = inputIOBox. take ( )
261272 group. addTask {
262- if let inputIO = inputIO {
273+ if let inputIO = inputIOContainer . take ( ) {
263274 let writer = StandardInputWriter ( diskIO: inputIO)
264275 try await input. write ( with: writer)
265276 try await writer. finish ( )
266277 }
267278 }
268279
269280 // Body runs in the same isolation
270- let errorSequence = AsyncBufferSequence ( diskIO: errorIO! )
281+ let errorSequence = AsyncBufferSequence ( diskIO: errorIOBox . take ( ) ! . consumeDiskIO ( ) )
271282 let result = try await body ( execution, errorSequence)
272283 try await group. waitForAll ( )
273284 return result
@@ -303,7 +314,7 @@ public func run<Result, Error: OutputProtocol>(
303314 error: try error. createPipe ( )
304315 ) { execution, inputIO, outputIO, errorIO in
305316 let writer = StandardInputWriter ( diskIO: inputIO!)
306- let outputSequence = AsyncBufferSequence ( diskIO: outputIO!)
317+ let outputSequence = AsyncBufferSequence ( diskIO: outputIO!. consumeDiskIO ( ) )
307318 return try await body ( execution, writer, outputSequence)
308319 }
309320}
@@ -336,7 +347,7 @@ public func run<Result, Output: OutputProtocol>(
336347 error: try error. createPipe ( )
337348 ) { execution, inputIO, outputIO, errorIO in
338349 let writer = StandardInputWriter ( diskIO: inputIO!)
339- let errorSequence = AsyncBufferSequence ( diskIO: errorIO!)
350+ let errorSequence = AsyncBufferSequence ( diskIO: errorIO!. consumeDiskIO ( ) )
340351 return try await body ( execution, writer, errorSequence)
341352 }
342353}
@@ -393,8 +404,8 @@ public func run<Result>(
393404 error: try error. createPipe ( )
394405 ) { execution, inputIO, outputIO, errorIO in
395406 let writer = StandardInputWriter ( diskIO: inputIO!)
396- let outputSequence = AsyncBufferSequence ( diskIO: outputIO!)
397- let errorSequence = AsyncBufferSequence ( diskIO: errorIO!)
407+ let outputSequence = AsyncBufferSequence ( diskIO: outputIO!. consumeDiskIO ( ) )
408+ let errorSequence = AsyncBufferSequence ( diskIO: errorIO!. consumeDiskIO ( ) )
398409 return try await body ( execution, writer, outputSequence, errorSequence)
399410 }
400411}
@@ -433,12 +444,18 @@ public func run<
433444 error: try error. createPipe ( )
434445 ) { ( execution, inputIO, outputIO, errorIO) -> RunResult in
435446 // Write input, capture output and error in parallel
447+ var inputIOBox : TrackedPlatformDiskIO ? = consume inputIO
448+ var outputIOBox : TrackedPlatformDiskIO ? = consume outputIO
449+ var errorIOBox : TrackedPlatformDiskIO ? = consume errorIO
436450 return try await withThrowingTaskGroup (
437451 of: OutputCapturingState< Output . OutputType, Error . OutputType>? . self ,
438452 returning: RunResult . self
439453 ) { group in
454+ var inputIOContainer : TrackedPlatformDiskIO ? = inputIOBox. take ( )
455+ var outputIOContainer : TrackedPlatformDiskIO ? = outputIOBox. take ( )
456+ var errorIOContainer : TrackedPlatformDiskIO ? = errorIOBox. take ( )
440457 group. addTask {
441- if let writeFd = inputIO {
458+ if let writeFd = inputIOContainer . take ( ) {
442459 let writer = StandardInputWriter ( diskIO: writeFd)
443460 try await input. write ( with: writer)
444461 try await writer. finish ( )
@@ -447,13 +464,13 @@ public func run<
447464 }
448465 group. addTask {
449466 let stdout = try await output. captureOutput (
450- from: outputIO
467+ from: outputIOContainer . take ( )
451468 )
452469 return . standardOutputCaptured( stdout)
453470 }
454471 group. addTask {
455472 let stderr = try await error. captureOutput (
456- from: errorIO
473+ from: errorIOContainer . take ( )
457474 )
458475 return . standardErrorCaptured( stderr)
459476 }
@@ -514,8 +531,8 @@ public func run<Result>(
514531 error: try error. createPipe ( )
515532 ) { execution, inputIO, outputIO, errorIO in
516533 let writer = StandardInputWriter ( diskIO: inputIO!)
517- let outputSequence = AsyncBufferSequence ( diskIO: outputIO!)
518- let errorSequence = AsyncBufferSequence ( diskIO: errorIO!)
534+ let outputSequence = AsyncBufferSequence ( diskIO: outputIO!. consumeDiskIO ( ) )
535+ let errorSequence = AsyncBufferSequence ( diskIO: errorIO!. consumeDiskIO ( ) )
519536 return try await body ( execution, writer, outputSequence, errorSequence)
520537 }
521538}
0 commit comments