@@ -110,27 +110,32 @@ public func run<
110
110
error: try error. createPipe ( )
111
111
) { execution, inputIO, outputIO, errorIO in
112
112
// 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
113
116
return try await withThrowingTaskGroup (
114
117
of: OutputCapturingState < Output . OutputType , Error . OutputType > . self,
115
118
returning: RunResult . self
116
119
) { group in
120
+ var outputIOContainer : TrackedPlatformDiskIO ? = outputIOBox. take ( )
121
+ var errorIOContainer : TrackedPlatformDiskIO ? = errorIOBox. take ( )
117
122
group. addTask {
118
123
let stdout = try await output. captureOutput (
119
- from: outputIO
124
+ from: outputIOContainer . take ( )
120
125
)
121
126
return . standardOutputCaptured( stdout)
122
127
}
123
128
group. addTask {
124
129
let stderr = try await error. captureOutput (
125
- from: errorIO
130
+ from: errorIOContainer . take ( )
126
131
)
127
132
return . standardErrorCaptured( stderr)
128
133
}
129
134
130
135
// Write span at the same isolation
131
- if let writeFd = inputIO {
136
+ if let writeFd = inputIOBox . take ( ) {
132
137
let writer = StandardInputWriter ( diskIO: writeFd)
133
- _ = try await writer. write ( input. bytes )
138
+ _ = try await writer. write ( input. _bytes )
134
139
try await writer. finish ( )
135
140
}
136
141
@@ -207,20 +212,23 @@ public func run<Result, Input: InputProtocol, Error: OutputProtocol>(
207
212
output: try output. createPipe ( ) ,
208
213
error: try error. createPipe ( )
209
214
) { execution, inputIO, outputIO, errorIO in
215
+ var inputIOBox : TrackedPlatformDiskIO ? = consume inputIO
216
+ var outputIOBox : TrackedPlatformDiskIO ? = consume outputIO
210
217
return try await withThrowingTaskGroup (
211
218
of: Void . self,
212
219
returning: Result . self
213
220
) { group in
221
+ var inputIOContainer : TrackedPlatformDiskIO ? = inputIOBox. take ( )
214
222
group. addTask {
215
- if let inputIO = inputIO {
223
+ if let inputIO = inputIOContainer . take ( ) {
216
224
let writer = StandardInputWriter ( diskIO: inputIO)
217
225
try await input. write ( with: writer)
218
226
try await writer. finish ( )
219
227
}
220
228
}
221
229
222
230
// Body runs in the same isolation
223
- let outputSequence = AsyncBufferSequence ( diskIO: outputIO! )
231
+ let outputSequence = AsyncBufferSequence ( diskIO: outputIOBox . take ( ) ! . consumeDiskIO ( ) )
224
232
let result = try await body ( execution, outputSequence)
225
233
try await group. waitForAll ( )
226
234
return result
@@ -254,20 +262,23 @@ public func run<Result, Input: InputProtocol, Output: OutputProtocol>(
254
262
output: try output. createPipe ( ) ,
255
263
error: try error. createPipe ( )
256
264
) { execution, inputIO, outputIO, errorIO in
265
+ var inputIOBox : TrackedPlatformDiskIO ? = consume inputIO
266
+ var errorIOBox : TrackedPlatformDiskIO ? = consume errorIO
257
267
return try await withThrowingTaskGroup (
258
268
of: Void . self,
259
269
returning: Result . self
260
270
) { group in
271
+ var inputIOContainer : TrackedPlatformDiskIO ? = inputIOBox. take ( )
261
272
group. addTask {
262
- if let inputIO = inputIO {
273
+ if let inputIO = inputIOContainer . take ( ) {
263
274
let writer = StandardInputWriter ( diskIO: inputIO)
264
275
try await input. write ( with: writer)
265
276
try await writer. finish ( )
266
277
}
267
278
}
268
279
269
280
// Body runs in the same isolation
270
- let errorSequence = AsyncBufferSequence ( diskIO: errorIO! )
281
+ let errorSequence = AsyncBufferSequence ( diskIO: errorIOBox . take ( ) ! . consumeDiskIO ( ) )
271
282
let result = try await body ( execution, errorSequence)
272
283
try await group. waitForAll ( )
273
284
return result
@@ -303,7 +314,7 @@ public func run<Result, Error: OutputProtocol>(
303
314
error: try error. createPipe ( )
304
315
) { execution, inputIO, outputIO, errorIO in
305
316
let writer = StandardInputWriter ( diskIO: inputIO!)
306
- let outputSequence = AsyncBufferSequence ( diskIO: outputIO!)
317
+ let outputSequence = AsyncBufferSequence ( diskIO: outputIO!. consumeDiskIO ( ) )
307
318
return try await body ( execution, writer, outputSequence)
308
319
}
309
320
}
@@ -336,7 +347,7 @@ public func run<Result, Output: OutputProtocol>(
336
347
error: try error. createPipe ( )
337
348
) { execution, inputIO, outputIO, errorIO in
338
349
let writer = StandardInputWriter ( diskIO: inputIO!)
339
- let errorSequence = AsyncBufferSequence ( diskIO: errorIO!)
350
+ let errorSequence = AsyncBufferSequence ( diskIO: errorIO!. consumeDiskIO ( ) )
340
351
return try await body ( execution, writer, errorSequence)
341
352
}
342
353
}
@@ -393,8 +404,8 @@ public func run<Result>(
393
404
error: try error. createPipe ( )
394
405
) { execution, inputIO, outputIO, errorIO in
395
406
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 ( ) )
398
409
return try await body ( execution, writer, outputSequence, errorSequence)
399
410
}
400
411
}
@@ -433,12 +444,18 @@ public func run<
433
444
error: try error. createPipe ( )
434
445
) { ( execution, inputIO, outputIO, errorIO) -> RunResult in
435
446
// 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
436
450
return try await withThrowingTaskGroup (
437
451
of: OutputCapturingState< Output . OutputType, Error . OutputType>? . self ,
438
452
returning: RunResult . self
439
453
) { group in
454
+ var inputIOContainer : TrackedPlatformDiskIO ? = inputIOBox. take ( )
455
+ var outputIOContainer : TrackedPlatformDiskIO ? = outputIOBox. take ( )
456
+ var errorIOContainer : TrackedPlatformDiskIO ? = errorIOBox. take ( )
440
457
group. addTask {
441
- if let writeFd = inputIO {
458
+ if let writeFd = inputIOContainer . take ( ) {
442
459
let writer = StandardInputWriter ( diskIO: writeFd)
443
460
try await input. write ( with: writer)
444
461
try await writer. finish ( )
@@ -447,13 +464,13 @@ public func run<
447
464
}
448
465
group. addTask {
449
466
let stdout = try await output. captureOutput (
450
- from: outputIO
467
+ from: outputIOContainer . take ( )
451
468
)
452
469
return . standardOutputCaptured( stdout)
453
470
}
454
471
group. addTask {
455
472
let stderr = try await error. captureOutput (
456
- from: errorIO
473
+ from: errorIOContainer . take ( )
457
474
)
458
475
return . standardErrorCaptured( stderr)
459
476
}
@@ -514,8 +531,8 @@ public func run<Result>(
514
531
error: try error. createPipe ( )
515
532
) { execution, inputIO, outputIO, errorIO in
516
533
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 ( ) )
519
536
return try await body ( execution, writer, outputSequence, errorSequence)
520
537
}
521
538
}
0 commit comments