Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(230)

Side by Side Diff: runtime/bin/process_macos.cc

Issue 2596543002: Fix Process.runSync error handling. (Closed)
Patch Set: Address comments Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/bin/process_linux.cc ('k') | runtime/bin/process_win.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #if !defined(DART_IO_DISABLED) 5 #if !defined(DART_IO_DISABLED)
6 6
7 #include "platform/globals.h" 7 #include "platform/globals.h"
8 #if defined(TARGET_OS_MACOS) 8 #if defined(TARGET_OS_MACOS)
9 9
10 #include "bin/process.h" 10 #include "bin/process.h"
(...skipping 766 matching lines...) Expand 10 before | Expand all | Expand 10 after
777 intptr_t* id, 777 intptr_t* id,
778 intptr_t* exit_event, 778 intptr_t* exit_event,
779 char** os_error_message) { 779 char** os_error_message) {
780 ProcessStarter starter(path, arguments, arguments_length, working_directory, 780 ProcessStarter starter(path, arguments, arguments_length, working_directory,
781 environment, environment_length, mode, in, out, err, 781 environment, environment_length, mode, in, out, err,
782 id, exit_event, os_error_message); 782 id, exit_event, os_error_message);
783 return starter.Start(); 783 return starter.Start();
784 } 784 }
785 785
786 786
787 class BufferList : public BufferListBase {
788 public:
789 BufferList() {}
790
791 bool Read(int fd, intptr_t available) {
792 // Read all available bytes.
793 while (available > 0) {
794 if (free_size_ == 0) {
795 Allocate();
796 }
797 ASSERT(free_size_ > 0);
798 ASSERT(free_size_ <= kBufferSize);
799 size_t block_size = dart::Utils::Minimum(free_size_, available);
800 ssize_t bytes = TEMP_FAILURE_RETRY(
801 read(fd, reinterpret_cast<void*>(FreeSpaceAddress()), block_size));
802 if (bytes < 0) {
803 return false;
804 }
805 data_size_ += bytes;
806 free_size_ -= bytes;
807 available -= bytes;
808 }
809 return true;
810 }
811
812 private:
813 DISALLOW_COPY_AND_ASSIGN(BufferList);
814 };
815
816
817 static bool CloseProcessBuffers(struct pollfd fds[3]) { 787 static bool CloseProcessBuffers(struct pollfd fds[3]) {
818 int e = errno; 788 int e = errno;
819 VOID_TEMP_FAILURE_RETRY(close(fds[0].fd)); 789 VOID_TEMP_FAILURE_RETRY(close(fds[0].fd));
820 VOID_TEMP_FAILURE_RETRY(close(fds[1].fd)); 790 VOID_TEMP_FAILURE_RETRY(close(fds[1].fd));
821 VOID_TEMP_FAILURE_RETRY(close(fds[2].fd)); 791 VOID_TEMP_FAILURE_RETRY(close(fds[2].fd));
822 errno = e; 792 errno = e;
823 return false; 793 return false;
824 } 794 }
825 795
826 796
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 if (i < alive) { 866 if (i < alive) {
897 fds[i] = fds[alive]; 867 fds[i] = fds[alive];
898 } 868 }
899 } 869 }
900 } 870 }
901 } 871 }
902 872
903 // All handles closed and all data read. 873 // All handles closed and all data read.
904 result->set_stdout_data(out_data.GetData()); 874 result->set_stdout_data(out_data.GetData());
905 result->set_stderr_data(err_data.GetData()); 875 result->set_stderr_data(err_data.GetData());
876 DEBUG_ASSERT(out_data.IsEmpty());
877 DEBUG_ASSERT(err_data.IsEmpty());
906 878
907 // Calculate the exit code. 879 // Calculate the exit code.
908 intptr_t exit_code = exit_code_data.ints[0]; 880 intptr_t exit_code = exit_code_data.ints[0];
909 intptr_t negative = exit_code_data.ints[1]; 881 intptr_t negative = exit_code_data.ints[1];
910 if (negative != 0) { 882 if (negative != 0) {
911 exit_code = -exit_code; 883 exit_code = -exit_code;
912 } 884 }
913 result->set_exit_code(exit_code); 885 result->set_exit_code(exit_code);
914 886
915 return true; 887 return true;
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
1114 VOID_NO_RETRY_EXPECTED(sigaction(signal, &act, NULL)); 1086 VOID_NO_RETRY_EXPECTED(sigaction(signal, &act, NULL));
1115 } 1087 }
1116 } 1088 }
1117 1089
1118 } // namespace bin 1090 } // namespace bin
1119 } // namespace dart 1091 } // namespace dart
1120 1092
1121 #endif // defined(TARGET_OS_MACOS) 1093 #endif // defined(TARGET_OS_MACOS)
1122 1094
1123 #endif // !defined(DART_IO_DISABLED) 1095 #endif // !defined(DART_IO_DISABLED)
OLDNEW
« no previous file with comments | « runtime/bin/process_linux.cc ('k') | runtime/bin/process_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698