@@ -283,6 +283,14 @@ private func currentProcessIdentifier() -> ProcessIdentifier {
283
283
#endif
284
284
}
285
285
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
+
286
294
// MARK: - Internal Functions
287
295
288
296
extension PipeConfiguration {
@@ -415,7 +423,7 @@ extension PipeConfiguration {
415
423
return try await withThrowingTaskGroup ( of: CollectedPipeResult . self, returning: CollectedResult< Output, Error> . self ) { group in
416
424
// Collect error output from all stages
417
425
group. addTask {
418
- let errorReadFileDescriptor = IODescriptor ( sharedErrorPipe. readEnd, closeWhenDone: true )
426
+ let errorReadFileDescriptor = createIODescriptor ( from : sharedErrorPipe. readEnd, closeWhenDone: true )
419
427
let errorReadEnd = errorReadFileDescriptor. createIOChannel ( )
420
428
421
429
let stderr = try await self . error. captureOutput ( from: errorReadEnd)
@@ -509,11 +517,11 @@ extension PipeConfiguration {
509
517
var inputReadEnd = inputReadFileDescriptor? . createIOChannel ( )
510
518
var inputWriteEnd : IOChannel ? = inputWriteFileDescriptor. take ( ) ? . createIOChannel ( )
511
519
512
- let outputWriteFileDescriptor = IODescriptor ( writeEnd, closeWhenDone: true )
520
+ let outputWriteFileDescriptor = createIODescriptor ( from : writeEnd, closeWhenDone: true )
513
521
var outputWriteEnd : IOChannel ? = outputWriteFileDescriptor. createIOChannel ( )
514
522
515
523
// Use shared error pipe instead of discarded
516
- let errorWriteFileDescriptor = IODescriptor ( sharedErrorPipe. writeEnd, closeWhenDone: false )
524
+ let errorWriteFileDescriptor = createIODescriptor ( from : sharedErrorPipe. writeEnd, closeWhenDone: false )
517
525
var errorWriteEnd : IOChannel ? = errorWriteFileDescriptor. createIOChannel ( )
518
526
519
527
let result = try await withThrowingTaskGroup ( of: Int32 . self) { group in
@@ -636,14 +644,14 @@ extension PipeConfiguration {
636
644
637
645
return taskResult
638
646
case . swiftFunction( let function) :
639
- let inputReadFileDescriptor = IODescriptor ( readEnd, closeWhenDone: true )
647
+ let inputReadFileDescriptor = createIODescriptor ( from : readEnd, closeWhenDone: true )
640
648
var inputReadEnd : IOChannel ? = inputReadFileDescriptor. createIOChannel ( )
641
649
642
- let outputWriteFileDescriptor = IODescriptor ( writeEnd, closeWhenDone: true )
650
+ let outputWriteFileDescriptor = createIODescriptor ( from : writeEnd, closeWhenDone: true )
643
651
var outputWriteEnd : IOChannel ? = outputWriteFileDescriptor. createIOChannel ( )
644
652
645
653
// 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 )
647
655
var errorWriteEnd : IOChannel ? = errorWriteFileDescriptor. createIOChannel ( )
648
656
649
657
let result = try await withThrowingTaskGroup ( of: Int32 . self) { group in
@@ -796,15 +804,15 @@ extension PipeConfiguration {
796
804
}
797
805
}
798
806
case . swiftFunction( let function) :
799
- let inputReadFileDescriptor = IODescriptor ( readEnd, closeWhenDone: true )
807
+ let inputReadFileDescriptor = createIODescriptor ( from : readEnd, closeWhenDone: true )
800
808
var inputReadEnd : IOChannel ? = inputReadFileDescriptor. createIOChannel ( )
801
809
802
810
var outputPipe = try self . output. createPipe ( )
803
811
let outputWriteFileDescriptor = outputPipe. writeFileDescriptor ( )
804
812
var outputWriteEnd : IOChannel ? = outputWriteFileDescriptor? . createIOChannel ( )
805
813
806
814
// Use shared error pipe instead of discarded
807
- let errorWriteFileDescriptor = IODescriptor ( sharedErrorPipe. writeEnd, closeWhenDone: false )
815
+ let errorWriteFileDescriptor = createIODescriptor ( from : sharedErrorPipe. writeEnd, closeWhenDone: false )
808
816
var errorWriteEnd : IOChannel ? = errorWriteFileDescriptor. createIOChannel ( )
809
817
810
818
let result : ( Int32 , Output . OutputType ) = try await withThrowingTaskGroup ( of: ( Int32, OutputCapturingState < Output . OutputType , ( ) > ? ) . self) { group in
0 commit comments