@@ -557,19 +557,30 @@ class TestProcess : XCTestCase {
557
557
task. executableURL = url
558
558
task. arguments = [ ]
559
559
let stdoutPipe = Pipe ( )
560
+ let dataLock = NSLock ( )
560
561
task. standardOutput = stdoutPipe
561
562
562
563
var stdoutData = Data ( )
563
564
stdoutPipe. fileHandleForReading. readabilityHandler = { fh in
564
- stdoutData. append ( fh. availableData)
565
+ dataLock. synchronized {
566
+ stdoutData. append ( fh. availableData)
567
+ }
565
568
}
566
569
try task. run ( )
567
570
task. waitUntilExit ( )
568
571
stdoutPipe. fileHandleForReading. readabilityHandler = nil
569
- if let d = try stdoutPipe. fileHandleForReading. readToEnd ( ) {
570
- stdoutData. append ( d)
572
+
573
+ try dataLock. synchronized {
574
+ #if DARWIN_COMPATIBILITY_TESTS
575
+ // Use old API for now
576
+ stdoutData. append ( stdoutPipe. fileHandleForReading. availableData)
577
+ #else
578
+ if let d = try stdoutPipe. fileHandleForReading. readToEnd ( ) {
579
+ stdoutData. append ( d)
580
+ }
581
+ #endif
582
+ XCTAssertEqual ( String ( data: stdoutData, encoding: . utf8) ? . trimmingCharacters ( in: . whitespacesAndNewlines) , " No files specified. " )
571
583
}
572
- XCTAssertEqual ( String ( data: stdoutData, encoding: . utf8) ? . trimmingCharacters ( in: . whitespacesAndNewlines) , " No files specified. " )
573
584
}
574
585
575
586
@@ -663,11 +674,11 @@ class _SignalHelperRunner {
663
674
}
664
675
else if strongSelf. gotReady == true {
665
676
if line == " Signal: SIGINT " {
666
- strongSelf. _sigIntCount += 1
677
+ strongSelf. sQueue . sync { strongSelf . _sigIntCount += 1 }
667
678
strongSelf. semaphore. signal ( )
668
679
}
669
680
else if line == " Signal: SIGCONT " {
670
- strongSelf. _sigContCount += 1
681
+ strongSelf. sQueue . sync { strongSelf . _sigContCount += 1 }
671
682
strongSelf. semaphore. signal ( )
672
683
}
673
684
}
@@ -724,52 +735,59 @@ internal func runTask(_ arguments: [String], environment: [String: String]? = ni
724
735
725
736
let stdoutPipe = Pipe ( )
726
737
let stderrPipe = Pipe ( )
738
+ let dataLock = NSLock ( )
727
739
process. standardOutput = stdoutPipe
728
740
process. standardError = stderrPipe
729
741
730
742
var stdoutData = Data ( )
731
743
stdoutPipe. fileHandleForReading. readabilityHandler = { fh in
732
- stdoutData. append ( fh. availableData)
744
+ dataLock. synchronized {
745
+ stdoutData. append ( fh. availableData)
746
+ }
733
747
}
734
748
735
749
var stderrData = Data ( )
736
750
stderrPipe. fileHandleForReading. readabilityHandler = { fh in
737
- stderrData. append ( fh. availableData)
751
+ dataLock. synchronized {
752
+ stderrData. append ( fh. availableData)
753
+ }
738
754
}
739
755
740
756
try process. run ( )
741
757
process. waitUntilExit ( )
742
758
stdoutPipe. fileHandleForReading. readabilityHandler = nil
743
759
stderrPipe. fileHandleForReading. readabilityHandler = nil
744
760
745
- // Drain any data remaining in the pipes
761
+ guard process. terminationStatus == 0 else {
762
+ throw Error . TerminationStatus ( process. terminationStatus)
763
+ }
764
+
765
+ return try dataLock. synchronized {
766
+ // Drain any data remaining in the pipes
746
767
#if DARWIN_COMPATIBILITY_TESTS
747
- // Use old API for now
748
- stdoutData. append ( stdoutPipe. fileHandleForReading. availableData)
749
- stderrData. append ( stderrPipe. fileHandleForReading. availableData)
768
+ // Use old API for now
769
+ stdoutData. append ( stdoutPipe. fileHandleForReading. availableData)
770
+ stderrData. append ( stderrPipe. fileHandleForReading. availableData)
750
771
#else
751
- if let d = try stdoutPipe. fileHandleForReading. readToEnd ( ) {
752
- stdoutData. append ( d)
753
- }
772
+ if let d = try stdoutPipe. fileHandleForReading. readToEnd ( ) {
773
+ stdoutData. append ( d)
774
+ }
754
775
755
- if let d = try stderrPipe. fileHandleForReading. readToEnd ( ) {
756
- stderrData. append ( d)
757
- }
776
+ if let d = try stderrPipe. fileHandleForReading. readToEnd ( ) {
777
+ stderrData. append ( d)
778
+ }
758
779
#endif
759
780
760
- guard process . terminationStatus == 0 else {
761
- throw Error . TerminationStatus ( process . terminationStatus )
762
- }
781
+ guard let stdout = String ( data : stdoutData , encoding : . utf8 ) else {
782
+ throw Error . UnicodeDecodingError ( stdoutData )
783
+ }
763
784
764
- guard let stdout = String ( data: stdoutData , encoding: . utf8) else {
765
- throw Error . UnicodeDecodingError ( stdoutData )
766
- }
785
+ guard let stderr = String ( data: stderrData , encoding: . utf8) else {
786
+ throw Error . UnicodeDecodingError ( stderrData )
787
+ }
767
788
768
- guard let stderr = String ( data: stderrData, encoding: . utf8) else {
769
- throw Error . UnicodeDecodingError ( stderrData)
789
+ return ( stdout, stderr)
770
790
}
771
-
772
- return ( stdout, stderr)
773
791
}
774
792
775
793
private func parseEnv( _ env: String ) throws -> [ String : String ] {
0 commit comments