@@ -90,9 +90,6 @@ public struct Configuration: Sendable {
90
90
// After spawn, cleanup child side fds
91
91
try await self . cleanup (
92
92
execution: execution,
93
- inputPipe: inputPipe,
94
- outputPipe: outputPipe,
95
- errorPipe: errorPipe,
96
93
childSide: true ,
97
94
parentSide: false ,
98
95
attemptToTerminateSubProcess: false
@@ -104,7 +101,7 @@ public struct Configuration: Sendable {
104
101
// Body runs in the same isolation
105
102
let result = try await body (
106
103
execution,
107
- . init( fileDescriptor : inputPipe. writeFileDescriptor !)
104
+ . init( diskIO : execution . inputPipe. writeEnd !)
108
105
)
109
106
return ExecutionResult (
110
107
terminationStatus: try await waitingStatus,
@@ -116,9 +113,6 @@ public struct Configuration: Sendable {
116
113
// this is the best we can do
117
114
try ? await self . cleanup (
118
115
execution: execution,
119
- inputPipe: inputPipe,
120
- outputPipe: outputPipe,
121
- errorPipe: errorPipe,
122
116
childSide: false ,
123
117
parentSide: true ,
124
118
attemptToTerminateSubProcess: true
@@ -154,9 +148,6 @@ public struct Configuration: Sendable {
154
148
// After spawn, clean up child side
155
149
try await self . cleanup (
156
150
execution: execution,
157
- inputPipe: inputPipe,
158
- outputPipe: outputPipe,
159
- errorPipe: errorPipe,
160
151
childSide: true ,
161
152
parentSide: false ,
162
153
attemptToTerminateSubProcess: false
@@ -174,7 +165,7 @@ public struct Configuration: Sendable {
174
165
standardError
175
166
) = try await execution. captureIOs ( )
176
167
// Write input in the same scope
177
- guard let writeFd = inputPipe. writeFileDescriptor else {
168
+ guard let writeFd = execution . inputPipe. writeEnd else {
178
169
fatalError ( " Trying to write to an input that has been closed " )
179
170
}
180
171
try await withCheckedThrowingContinuation { ( continuation: CheckedContinuation < Void , any Swift . Error > ) in
@@ -193,7 +184,7 @@ public struct Configuration: Sendable {
193
184
)
194
185
#endif
195
186
196
- writeFd. wrapped . write ( bytes) { _, error in
187
+ writeFd. write ( bytes) { _, error in
197
188
if let error = error {
198
189
continuation. resume ( throwing: error)
199
190
} else {
@@ -216,9 +207,6 @@ public struct Configuration: Sendable {
216
207
// this is the best we can do
217
208
try ? await self . cleanup (
218
209
execution: execution,
219
- inputPipe: inputPipe,
220
- outputPipe: outputPipe,
221
- errorPipe: errorPipe,
222
210
childSide: false ,
223
211
parentSide: true ,
224
212
attemptToTerminateSubProcess: true
@@ -257,9 +245,6 @@ public struct Configuration: Sendable {
257
245
// After spawn, clean up child side
258
246
try await self . cleanup (
259
247
execution: execution,
260
- inputPipe: inputPipe,
261
- outputPipe: outputPipe,
262
- errorPipe: errorPipe,
263
248
childSide: true ,
264
249
parentSide: false ,
265
250
attemptToTerminateSubProcess: false
@@ -271,8 +256,8 @@ public struct Configuration: Sendable {
271
256
returning: ExecutionResult . self
272
257
) { group in
273
258
group. addTask {
274
- if let writeFd = inputPipe. writeFileDescriptor {
275
- let writer = StandardInputWriter ( fileDescriptor : writeFd)
259
+ if let writeFd = execution . inputPipe. writeEnd {
260
+ let writer = StandardInputWriter ( diskIO : writeFd)
276
261
try await input. write ( with: writer)
277
262
try await writer. finish ( )
278
263
}
@@ -300,9 +285,6 @@ public struct Configuration: Sendable {
300
285
// this is the best we can do
301
286
try ? await self . cleanup (
302
287
execution: execution,
303
- inputPipe: inputPipe,
304
- outputPipe: outputPipe,
305
- errorPipe: errorPipe,
306
288
childSide: false ,
307
289
parentSide: true ,
308
290
attemptToTerminateSubProcess: true
@@ -350,9 +332,6 @@ extension Configuration {
350
332
Error: OutputProtocol
351
333
> (
352
334
execution: Execution < Output , Error > ,
353
- inputPipe: CreatedPipe ,
354
- outputPipe: CreatedPipe ,
355
- errorPipe: CreatedPipe ,
356
335
childSide: Bool ,
357
336
parentSide: Bool ,
358
337
attemptToTerminateSubProcess: Bool
@@ -384,25 +363,25 @@ extension Configuration {
384
363
385
364
if childSide {
386
365
inputError = captureError {
387
- try inputPipe. readFileDescriptor ? . safelyClose ( )
366
+ try execution . inputPipe. readEnd ? . safelyClose ( )
388
367
}
389
368
outputError = captureError {
390
- try outputPipe. writeFileDescriptor ? . safelyClose ( )
369
+ try execution . outputPipe. writeEnd ? . safelyClose ( )
391
370
}
392
371
errorError = captureError {
393
- try errorPipe. writeFileDescriptor ? . safelyClose ( )
372
+ try execution . errorPipe. writeEnd ? . safelyClose ( )
394
373
}
395
374
}
396
375
397
376
if parentSide {
398
377
inputError = captureError {
399
- try inputPipe. writeFileDescriptor ? . safelyClose ( )
378
+ try execution . inputPipe. writeEnd ? . safelyClose ( )
400
379
}
401
380
outputError = captureError {
402
- try outputPipe. readFileDescriptor ? . safelyClose ( )
381
+ try execution . outputPipe. readEnd ? . safelyClose ( )
403
382
}
404
383
errorError = captureError {
405
- try errorPipe. readFileDescriptor ? . safelyClose ( )
384
+ try execution . errorPipe. readEnd ? . safelyClose ( )
406
385
}
407
386
}
408
387
@@ -822,17 +801,17 @@ internal enum StringOrRawBytes: Sendable, Hashable {
822
801
}
823
802
}
824
803
825
- /// A simple wrapper on `FileDescriptor` plus a flag indicating
826
- /// whether it should be closed automactially when done.
827
- internal struct TrackedFileDescriptor : Hashable {
804
+ /// A wrapped `FileDescriptor` and whether it should be closed
805
+ /// automactially when done.
806
+ internal struct TrackedFileDescriptor {
828
807
internal let closeWhenDone : Bool
829
- internal let wrapped : FileDescriptor
808
+ internal let fileDescriptor : FileDescriptor
830
809
831
810
internal init (
832
- _ wrapped : FileDescriptor ,
811
+ _ fileDescriptor : FileDescriptor ,
833
812
closeWhenDone: Bool
834
813
) {
835
- self . wrapped = wrapped
814
+ self . fileDescriptor = fileDescriptor
836
815
self . closeWhenDone = closeWhenDone
837
816
}
838
817
@@ -842,7 +821,7 @@ internal struct TrackedFileDescriptor: Hashable {
842
821
}
843
822
844
823
do {
845
- try self . wrapped . close ( )
824
+ try fileDescriptor . close ( )
846
825
} catch {
847
826
guard let errno: Errno = error as? Errno else {
848
827
throw error
@@ -854,25 +833,53 @@ internal struct TrackedFileDescriptor: Hashable {
854
833
}
855
834
856
835
internal var platformDescriptor : PlatformFileDescriptor {
857
- return self . wrapped. platformDescriptor
836
+ return self . fileDescriptor. platformDescriptor
837
+ }
838
+ }
839
+
840
+ #if !os(Windows)
841
+ /// A wrapped `DispatchIO` and whether it should be closed
842
+ /// automactially when done.
843
+ internal struct TrackedDispatchIO {
844
+ internal let closeWhenDone : Bool
845
+ internal let dispatchIO : DispatchIO
846
+
847
+ internal init (
848
+ _ dispatchIO: DispatchIO ,
849
+ closeWhenDone: Bool
850
+ ) {
851
+ self . dispatchIO = dispatchIO
852
+ self . closeWhenDone = closeWhenDone
853
+ }
854
+
855
+ internal func safelyClose( ) throws {
856
+ guard self . closeWhenDone else {
857
+ return
858
+ }
859
+
860
+ dispatchIO. close ( )
861
+ }
862
+
863
+ internal var platformDescriptor : PlatformFileDescriptor {
864
+ return self . dispatchIO. fileDescriptor
858
865
}
859
866
}
867
+ #endif
860
868
861
869
internal struct CreatedPipe {
862
870
internal let readFileDescriptor : TrackedFileDescriptor ?
863
871
internal let writeFileDescriptor : TrackedFileDescriptor ?
864
872
865
873
internal init (
866
874
readFileDescriptor: TrackedFileDescriptor ? ,
867
- writeFileDescriptor: TrackedFileDescriptor ?
875
+ writeFileDescriptor: TrackedFileDescriptor ? ,
868
876
) {
869
877
self . readFileDescriptor = readFileDescriptor
870
878
self . writeFileDescriptor = writeFileDescriptor
871
879
}
872
880
873
881
internal init ( closeWhenDone: Bool ) throws {
874
882
let pipe = try FileDescriptor . ssp_pipe ( )
875
-
876
883
self . readFileDescriptor = . init(
877
884
pipe. readEnd,
878
885
closeWhenDone: closeWhenDone
0 commit comments