@@ -283,6 +283,14 @@ private func currentProcessIdentifier() -> ProcessIdentifier {
283283 #endif
284284}
285285
286+ private func createIODescriptor( from fd: FileDescriptor , closeWhenDone: Bool ) -> IODescriptor {
287+ #if canImport(WinSDK)
288+ let errorReadFileDescriptor = IODescriptor ( HANDLE ( bitPattern: _get_osfhandle ( fd. rawValue) ) !, closeWhenDone: closeWhenDone)
289+ #else
290+ let errorReadFileDescriptor = IODescriptor ( fd, closeWhenDone: closeWhenDone)
291+ #endif
292+ }
293+
286294// MARK: - Internal Functions
287295
288296extension PipeConfiguration {
@@ -415,7 +423,7 @@ extension PipeConfiguration {
415423 return try await withThrowingTaskGroup ( of: CollectedPipeResult . self, returning: CollectedResult< Output, Error> . self ) { group in
416424 // Collect error output from all stages
417425 group. addTask {
418- let errorReadFileDescriptor = IODescriptor ( sharedErrorPipe. readEnd, closeWhenDone: true )
426+ let errorReadFileDescriptor = createIODescriptor ( from : sharedErrorPipe. readEnd, closeWhenDone: true )
419427 let errorReadEnd = errorReadFileDescriptor. createIOChannel ( )
420428
421429 let stderr = try await self . error. captureOutput ( from: errorReadEnd)
@@ -509,11 +517,11 @@ extension PipeConfiguration {
509517 var inputReadEnd = inputReadFileDescriptor? . createIOChannel ( )
510518 var inputWriteEnd : IOChannel ? = inputWriteFileDescriptor. take ( ) ? . createIOChannel ( )
511519
512- let outputWriteFileDescriptor = IODescriptor ( writeEnd, closeWhenDone: true )
520+ let outputWriteFileDescriptor = createIODescriptor ( from : writeEnd, closeWhenDone: true )
513521 var outputWriteEnd : IOChannel ? = outputWriteFileDescriptor. createIOChannel ( )
514522
515523 // Use shared error pipe instead of discarded
516- let errorWriteFileDescriptor = IODescriptor ( sharedErrorPipe. writeEnd, closeWhenDone: false )
524+ let errorWriteFileDescriptor = createIODescriptor ( from : sharedErrorPipe. writeEnd, closeWhenDone: false )
517525 var errorWriteEnd : IOChannel ? = errorWriteFileDescriptor. createIOChannel ( )
518526
519527 let result = try await withThrowingTaskGroup ( of: Int32 . self) { group in
@@ -636,14 +644,14 @@ extension PipeConfiguration {
636644
637645 return taskResult
638646 case . swiftFunction( let function) :
639- let inputReadFileDescriptor = IODescriptor ( readEnd, closeWhenDone: true )
647+ let inputReadFileDescriptor = createIODescriptor ( from : readEnd, closeWhenDone: true )
640648 var inputReadEnd : IOChannel ? = inputReadFileDescriptor. createIOChannel ( )
641649
642- let outputWriteFileDescriptor = IODescriptor ( writeEnd, closeWhenDone: true )
650+ let outputWriteFileDescriptor = createIODescriptor ( from : writeEnd, closeWhenDone: true )
643651 var outputWriteEnd : IOChannel ? = outputWriteFileDescriptor. createIOChannel ( )
644652
645653 // Use shared error pipe instead of discarded
646- let errorWriteFileDescriptor = IODescriptor ( sharedErrorPipe. writeEnd, closeWhenDone: false )
654+ let errorWriteFileDescriptor : IODescriptor = createIODescriptor ( from : sharedErrorPipe. writeEnd, closeWhenDone: false )
647655 var errorWriteEnd : IOChannel ? = errorWriteFileDescriptor. createIOChannel ( )
648656
649657 let result = try await withThrowingTaskGroup ( of: Int32 . self) { group in
@@ -796,15 +804,15 @@ extension PipeConfiguration {
796804 }
797805 }
798806 case . swiftFunction( let function) :
799- let inputReadFileDescriptor = IODescriptor ( readEnd, closeWhenDone: true )
807+ let inputReadFileDescriptor = createIODescriptor ( from : readEnd, closeWhenDone: true )
800808 var inputReadEnd : IOChannel ? = inputReadFileDescriptor. createIOChannel ( )
801809
802810 var outputPipe = try self . output. createPipe ( )
803811 let outputWriteFileDescriptor = outputPipe. writeFileDescriptor ( )
804812 var outputWriteEnd : IOChannel ? = outputWriteFileDescriptor? . createIOChannel ( )
805813
806814 // Use shared error pipe instead of discarded
807- let errorWriteFileDescriptor = IODescriptor ( sharedErrorPipe. writeEnd, closeWhenDone: false )
815+ let errorWriteFileDescriptor = createIODescriptor ( from : sharedErrorPipe. writeEnd, closeWhenDone: false )
808816 var errorWriteEnd : IOChannel ? = errorWriteFileDescriptor. createIOChannel ( )
809817
810818 let result : ( Int32 , Output . OutputType ) = try await withThrowingTaskGroup ( of: ( Int32, OutputCapturingState < Output . OutputType , ( ) > ? ) . self) { group in
0 commit comments