@@ -299,6 +299,28 @@ private func createTerminationStatus(_ exitCode: UInt32) -> TerminationStatus {
299299 #endif
300300}
301301
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+
302324// MARK: - Internal Functions
303325
304326extension PipeConfiguration {
@@ -425,8 +447,7 @@ extension PipeConfiguration {
425447 /// Run the pipeline using withTaskGroup
426448 private func runPipeline( ) async throws -> CollectedResult < Output , Error > {
427449 // 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 ( )
430451
431452 return try await withThrowingTaskGroup ( of: CollectedPipeResult . self, returning: CollectedResult< Output, Error> . self ) { group in
432453 // Collect error output from all stages
@@ -444,8 +465,7 @@ extension PipeConfiguration {
444465 // Create pipes between stages
445466 var pipes : [ ( readEnd: FileDescriptor , writeEnd: FileDescriptor ) ] = [ ]
446467 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 ( ) )
449469 }
450470
451471 let pipeResult = try await withThrowingTaskGroup ( of: PipelineTaskResult . self, returning: CollectedResult< Output, DiscardedOutput> . self ) { group in
0 commit comments