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