@@ -299,6 +299,28 @@ private func createTerminationStatus(_ exitCode: UInt32) -> TerminationStatus {
299
299
#endif
300
300
}
301
301
302
+ private func createPipe( ) throws -> ( readEnd: FileDescriptor , writeEnd: FileDescriptor ) {
303
+ var createdPipe = try CreatedPipe ( closeWhenDone: false , purpose: . output)
304
+
305
+ #if canImport(WinSDK)
306
+ let readHandle = createdPipe. readFileDescriptor ( ) !. platformDescriptor ( )
307
+ let writeHandle = createdPipe. writeFileDescriptor ( ) !. platformDescriptor ( )
308
+ let readFd = _open_osfhandle (
309
+ intptr_t ( bitPattern: readHandle) ,
310
+ FileDescriptor . AccessMode. readOnly. rawValue
311
+ )
312
+ let writeFd = _open_osfhandle (
313
+ intptr_t ( bitPattern: writeHandle) ,
314
+ FileDescriptor . AccessMode. writeOnly. rawValue
315
+ )
316
+ #else
317
+ let readFd = createdPipe. readFileDescriptor ( ) !. platformDescriptor ( )
318
+ let writeFd = createdPipe. writeFileDescriptor ( ) !. platformDescriptor ( )
319
+ #endif
320
+
321
+ return ( readEnd: FileDescriptor ( rawValue: readFd) , writeEnd: FileDescriptor ( rawValue: writeFd) )
322
+ }
323
+
302
324
// MARK: - Internal Functions
303
325
304
326
extension PipeConfiguration {
@@ -425,8 +447,7 @@ extension PipeConfiguration {
425
447
/// Run the pipeline using withTaskGroup
426
448
private func runPipeline( ) async throws -> CollectedResult < Output , Error > {
427
449
// Create a pipe for standard error
428
- var sharedErrorCreatedPipe = try CreatedPipe ( closeWhenDone: false , purpose: . output)
429
- let sharedErrorPipe = ( readEnd: FileDescriptor ( rawValue: sharedErrorCreatedPipe. readFileDescriptor ( ) !. platformDescriptor ( ) ) , writeEnd: FileDescriptor ( rawValue: sharedErrorCreatedPipe. writeFileDescriptor ( ) !. platformDescriptor ( ) ) )
450
+ let sharedErrorPipe = try createPipe ( )
430
451
431
452
return try await withThrowingTaskGroup ( of: CollectedPipeResult . self, returning: CollectedResult< Output, Error> . self ) { group in
432
453
// Collect error output from all stages
@@ -444,8 +465,7 @@ extension PipeConfiguration {
444
465
// Create pipes between stages
445
466
var pipes : [ ( readEnd: FileDescriptor , writeEnd: FileDescriptor ) ] = [ ]
446
467
for _ in 0 ..< ( stages. count - 1 ) {
447
- var pipe = try CreatedPipe ( closeWhenDone: false , purpose: . input)
448
- pipes. append ( ( readEnd: FileDescriptor ( rawValue: pipe. readFileDescriptor ( ) !. platformDescriptor ( ) ) , writeEnd: FileDescriptor ( rawValue: pipe. writeFileDescriptor ( ) !. platformDescriptor ( ) ) ) )
468
+ try pipes. append ( createPipe ( ) )
449
469
}
450
470
451
471
let pipeResult = try await withThrowingTaskGroup ( of: PipelineTaskResult . self, returning: CollectedResult< Output, DiscardedOutput> . self ) { group in
0 commit comments