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