OLD | NEW |
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 #include "platform/globals.h" | 5 #include "platform/globals.h" |
6 #if defined(TARGET_OS_WINDOWS) | 6 #if defined(TARGET_OS_WINDOWS) |
7 | 7 |
8 #include <process.h> // NOLINT | 8 #include <process.h> // NOLINT |
9 | 9 |
10 #include "bin/builtin.h" | 10 #include "bin/builtin.h" |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 bool success = LookupProcess(pid, &handle, &wait_handle, &exit_pipe); | 148 bool success = LookupProcess(pid, &handle, &wait_handle, &exit_pipe); |
149 if (!success) { | 149 if (!success) { |
150 FATAL("Failed to lookup process in list of active processes"); | 150 FATAL("Failed to lookup process in list of active processes"); |
151 } | 151 } |
152 // Unregister the event in a non-blocking way. | 152 // Unregister the event in a non-blocking way. |
153 BOOL ok = UnregisterWait(wait_handle); | 153 BOOL ok = UnregisterWait(wait_handle); |
154 if (!ok && GetLastError() != ERROR_IO_PENDING) { | 154 if (!ok && GetLastError() != ERROR_IO_PENDING) { |
155 FATAL("Failed unregistering wait operation"); | 155 FATAL("Failed unregistering wait operation"); |
156 } | 156 } |
157 // Get and report the exit code to Dart. | 157 // Get and report the exit code to Dart. |
158 int exit_code; | 158 DWORD exit_code; |
159 ok = GetExitCodeProcess(handle, | 159 ok = GetExitCodeProcess(handle, |
160 reinterpret_cast<DWORD*>(&exit_code)); | 160 reinterpret_cast<DWORD*>(&exit_code)); |
161 if (!ok) { | 161 if (!ok) { |
162 FATAL1("GetExitCodeProcess failed %d\n", GetLastError()); | 162 FATAL1("GetExitCodeProcess failed %d\n", GetLastError()); |
163 } | 163 } |
164 int negative = 0; | 164 int message[2] = { exit_code, 0 }; |
165 if (exit_code < 0) { | |
166 exit_code = abs(exit_code); | |
167 negative = 1; | |
168 } | |
169 int message[2] = { exit_code, negative }; | |
170 DWORD written; | 165 DWORD written; |
171 ok = WriteFile(exit_pipe, message, sizeof(message), &written, NULL); | 166 ok = WriteFile(exit_pipe, message, sizeof(message), &written, NULL); |
172 // If the process has been closed, the read end of the exit | 167 // If the process has been closed, the read end of the exit |
173 // pipe has been closed. It is therefore not a problem that | 168 // pipe has been closed. It is therefore not a problem that |
174 // WriteFile fails with a closed pipe error | 169 // WriteFile fails with a closed pipe error |
175 // (ERROR_NO_DATA). Other errors should not happen. | 170 // (ERROR_NO_DATA). Other errors should not happen. |
176 if (ok && written != sizeof(message)) { | 171 if (ok && written != sizeof(message)) { |
177 FATAL("Failed to write entire process exit message"); | 172 FATAL("Failed to write entire process exit message"); |
178 } else if (!ok && GetLastError() != ERROR_NO_DATA) { | 173 } else if (!ok && GetLastError() != ERROR_NO_DATA) { |
179 FATAL1("Failed to write exit code: %d", GetLastError()); | 174 FATAL1("Failed to write exit code: %d", GetLastError()); |
(...skipping 666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
846 | 841 |
847 | 842 |
848 intptr_t Process::CurrentProcessId() { | 843 intptr_t Process::CurrentProcessId() { |
849 return static_cast<intptr_t>(GetCurrentProcessId()); | 844 return static_cast<intptr_t>(GetCurrentProcessId()); |
850 } | 845 } |
851 | 846 |
852 } // namespace bin | 847 } // namespace bin |
853 } // namespace dart | 848 } // namespace dart |
854 | 849 |
855 #endif // defined(TARGET_OS_WINDOWS) | 850 #endif // defined(TARGET_OS_WINDOWS) |
OLD | NEW |