@@ -109,48 +109,25 @@ public func run<
109
109
output: try output. createPipe ( ) ,
110
110
error: try error. createPipe ( )
111
111
) { execution, inputIO, outputIO, errorIO in
112
- // Write input, capture output and error in parallel
113
- return try await withThrowingTaskGroup (
114
- of: OutputCapturingState < Output . OutputType , Error . OutputType > . self,
115
- returning: RunResult . self
116
- ) { group in
117
- group. addTask {
118
- let stdout = try await output. captureOutput (
119
- from: outputIO
120
- )
121
- return . standardOutputCaptured( stdout)
122
- }
123
- group. addTask {
124
- let stderr = try await error. captureOutput (
125
- from: errorIO
126
- )
127
- return . standardErrorCaptured( stderr)
128
- }
112
+ var inputIOBox : TrackedPlatformDiskIO ? = consume inputIO
113
+ var outputIOBox : TrackedPlatformDiskIO ? = consume outputIO
114
+ var errorIOBox : TrackedPlatformDiskIO ? = consume errorIO
129
115
130
- // Write span at the same isolation
131
- if let writeFd = inputIO {
132
- let writer = StandardInputWriter ( diskIO: writeFd)
133
- _ = try await writer. write ( input. bytes)
134
- try await writer. finish ( )
135
- }
136
-
137
- var stdout : Output . OutputType !
138
- var stderror : Error . OutputType !
139
- while let state = try await group. next ( ) {
140
- switch state {
141
- case . standardOutputCaptured( let output) :
142
- stdout = output
143
- case . standardErrorCaptured( let error) :
144
- stderror = error
145
- }
146
- }
147
-
148
- return (
149
- processIdentifier: execution. processIdentifier,
150
- standardOutput: stdout,
151
- standardError: stderror
152
- )
116
+ // Write input, capture output and error in parallel
117
+ async let stdout = try output. captureOutput( from: outputIOBox. take ( ) )
118
+ async let stderr = try error. captureOutput( from: errorIOBox. take ( ) )
119
+ // Write span at the same isolation
120
+ if let writeFd = inputIOBox. take( ) {
121
+ let writer = StandardInputWriter( diskIO: writeFd)
122
+ _ = try await writer. write( input. _bytes)
123
+ try await writer. finish( )
153
124
}
125
+
126
+ return (
127
+ processIdentifier: execution. processIdentifier,
128
+ standardOutput: try await stdout,
129
+ standardError: try await stderr
130
+ )
154
131
}
155
132
156
133
return CollectedResult (
@@ -207,20 +184,23 @@ public func run<Result, Input: InputProtocol, Error: OutputProtocol>(
207
184
output: try output. createPipe ( ) ,
208
185
error: try error. createPipe ( )
209
186
) { execution, inputIO, outputIO, errorIO in
187
+ var inputIOBox : TrackedPlatformDiskIO ? = consume inputIO
188
+ var outputIOBox : TrackedPlatformDiskIO ? = consume outputIO
210
189
return try await withThrowingTaskGroup (
211
190
of: Void . self,
212
191
returning: Result . self
213
192
) { group in
193
+ var inputIOContainer : TrackedPlatformDiskIO ? = inputIOBox. take ( )
214
194
group. addTask {
215
- if let inputIO = inputIO {
195
+ if let inputIO = inputIOContainer . take ( ) {
216
196
let writer = StandardInputWriter ( diskIO: inputIO)
217
197
try await input. write ( with: writer)
218
198
try await writer. finish ( )
219
199
}
220
200
}
221
201
222
202
// Body runs in the same isolation
223
- let outputSequence = AsyncBufferSequence ( diskIO: outputIO! )
203
+ let outputSequence = AsyncBufferSequence ( diskIO: outputIOBox . take ( ) ! . consumeDiskIO ( ) )
224
204
let result = try await body ( execution, outputSequence)
225
205
try await group. waitForAll ( )
226
206
return result
@@ -254,20 +234,23 @@ public func run<Result, Input: InputProtocol, Output: OutputProtocol>(
254
234
output: try output. createPipe ( ) ,
255
235
error: try error. createPipe ( )
256
236
) { execution, inputIO, outputIO, errorIO in
237
+ var inputIOBox : TrackedPlatformDiskIO ? = consume inputIO
238
+ var errorIOBox : TrackedPlatformDiskIO ? = consume errorIO
257
239
return try await withThrowingTaskGroup (
258
240
of: Void . self,
259
241
returning: Result . self
260
242
) { group in
243
+ var inputIOContainer : TrackedPlatformDiskIO ? = inputIOBox. take ( )
261
244
group. addTask {
262
- if let inputIO = inputIO {
245
+ if let inputIO = inputIOContainer . take ( ) {
263
246
let writer = StandardInputWriter ( diskIO: inputIO)
264
247
try await input. write ( with: writer)
265
248
try await writer. finish ( )
266
249
}
267
250
}
268
251
269
252
// Body runs in the same isolation
270
- let errorSequence = AsyncBufferSequence ( diskIO: errorIO! )
253
+ let errorSequence = AsyncBufferSequence ( diskIO: errorIOBox . take ( ) ! . consumeDiskIO ( ) )
271
254
let result = try await body ( execution, errorSequence)
272
255
try await group. waitForAll ( )
273
256
return result
@@ -303,7 +286,7 @@ public func run<Result, Error: OutputProtocol>(
303
286
error: try error. createPipe ( )
304
287
) { execution, inputIO, outputIO, errorIO in
305
288
let writer = StandardInputWriter ( diskIO: inputIO!)
306
- let outputSequence = AsyncBufferSequence ( diskIO: outputIO!)
289
+ let outputSequence = AsyncBufferSequence ( diskIO: outputIO!. consumeDiskIO ( ) )
307
290
return try await body ( execution, writer, outputSequence)
308
291
}
309
292
}
@@ -336,7 +319,7 @@ public func run<Result, Output: OutputProtocol>(
336
319
error: try error. createPipe ( )
337
320
) { execution, inputIO, outputIO, errorIO in
338
321
let writer = StandardInputWriter ( diskIO: inputIO!)
339
- let errorSequence = AsyncBufferSequence ( diskIO: errorIO!)
322
+ let errorSequence = AsyncBufferSequence ( diskIO: errorIO!. consumeDiskIO ( ) )
340
323
return try await body ( execution, writer, errorSequence)
341
324
}
342
325
}
@@ -393,8 +376,8 @@ public func run<Result>(
393
376
error: try error. createPipe ( )
394
377
) { execution, inputIO, outputIO, errorIO in
395
378
let writer = StandardInputWriter ( diskIO: inputIO!)
396
- let outputSequence = AsyncBufferSequence ( diskIO: outputIO!)
397
- let errorSequence = AsyncBufferSequence ( diskIO: errorIO!)
379
+ let outputSequence = AsyncBufferSequence ( diskIO: outputIO!. consumeDiskIO ( ) )
380
+ let errorSequence = AsyncBufferSequence ( diskIO: errorIO!. consumeDiskIO ( ) )
398
381
return try await body ( execution, writer, outputSequence, errorSequence)
399
382
}
400
383
}
@@ -433,12 +416,18 @@ public func run<
433
416
error: try error. createPipe ( )
434
417
) { ( execution, inputIO, outputIO, errorIO) -> RunResult in
435
418
// Write input, capture output and error in parallel
419
+ var inputIOBox : TrackedPlatformDiskIO ? = consume inputIO
420
+ var outputIOBox : TrackedPlatformDiskIO ? = consume outputIO
421
+ var errorIOBox : TrackedPlatformDiskIO ? = consume errorIO
436
422
return try await withThrowingTaskGroup (
437
423
of: OutputCapturingState< Output . OutputType, Error . OutputType>? . self ,
438
424
returning: RunResult . self
439
425
) { group in
426
+ var inputIOContainer : TrackedPlatformDiskIO ? = inputIOBox. take ( )
427
+ var outputIOContainer : TrackedPlatformDiskIO ? = outputIOBox. take ( )
428
+ var errorIOContainer : TrackedPlatformDiskIO ? = errorIOBox. take ( )
440
429
group. addTask {
441
- if let writeFd = inputIO {
430
+ if let writeFd = inputIOContainer . take ( ) {
442
431
let writer = StandardInputWriter ( diskIO: writeFd)
443
432
try await input. write ( with: writer)
444
433
try await writer. finish ( )
@@ -447,13 +436,13 @@ public func run<
447
436
}
448
437
group. addTask {
449
438
let stdout = try await output. captureOutput (
450
- from: outputIO
439
+ from: outputIOContainer . take ( )
451
440
)
452
441
return . standardOutputCaptured( stdout)
453
442
}
454
443
group. addTask {
455
444
let stderr = try await error. captureOutput (
456
- from: errorIO
445
+ from: errorIOContainer . take ( )
457
446
)
458
447
return . standardErrorCaptured( stderr)
459
448
}
@@ -514,8 +503,8 @@ public func run<Result>(
514
503
error: try error. createPipe ( )
515
504
) { execution, inputIO, outputIO, errorIO in
516
505
let writer = StandardInputWriter ( diskIO: inputIO!)
517
- let outputSequence = AsyncBufferSequence ( diskIO: outputIO!)
518
- let errorSequence = AsyncBufferSequence ( diskIO: errorIO!)
506
+ let outputSequence = AsyncBufferSequence ( diskIO: outputIO!. consumeDiskIO ( ) )
507
+ let errorSequence = AsyncBufferSequence ( diskIO: errorIO!. consumeDiskIO ( ) )
519
508
return try await body ( execution, writer, outputSequence, errorSequence)
520
509
}
521
510
}
0 commit comments