| Index: runtime/bin/process.cc
|
| diff --git a/runtime/bin/process.cc b/runtime/bin/process.cc
|
| index 9720d39e75093baeed6236c5707e5354e084147a..f6366579652090d6e9c38b2ac020011f390bc089 100644
|
| --- a/runtime/bin/process.cc
|
| +++ b/runtime/bin/process.cc
|
| @@ -72,6 +72,14 @@ static char** ExtractCStringList(Dart_Handle strings,
|
| return string_args;
|
| }
|
|
|
| +
|
| +void Process::ClearAllSignalHandlers() {
|
| + for (intptr_t i = 1; i <= kLastSignal; i++) {
|
| + ClearSignalHandler(i);
|
| + }
|
| +}
|
| +
|
| +
|
| void FUNCTION_NAME(Process_Start)(Dart_NativeArguments args) {
|
| Dart_Handle process = Dart_GetNativeArgument(args, 0);
|
| intptr_t process_stdin;
|
| @@ -153,12 +161,12 @@ void FUNCTION_NAME(Process_Start)(Dart_NativeArguments args) {
|
| &process_stdin, &process_stderr, &pid, &exit_event, &os_error_message);
|
| if (error_code == 0) {
|
| if (mode != kDetached) {
|
| - Socket::SetSocketIdNativeField(stdin_handle, process_stdin);
|
| - Socket::SetSocketIdNativeField(stdout_handle, process_stdout);
|
| - Socket::SetSocketIdNativeField(stderr_handle, process_stderr);
|
| + Socket::SetSocketIdNativeField(stdin_handle, process_stdin, false);
|
| + Socket::SetSocketIdNativeField(stdout_handle, process_stdout, false);
|
| + Socket::SetSocketIdNativeField(stderr_handle, process_stderr, false);
|
| }
|
| if (mode == kNormal) {
|
| - Socket::SetSocketIdNativeField(exit_handle, exit_event);
|
| + Socket::SetSocketIdNativeField(exit_handle, exit_event, false);
|
| }
|
| Process::SetProcessIdNativeField(process, pid);
|
| } else {
|
| @@ -181,19 +189,26 @@ void FUNCTION_NAME(Process_Start)(Dart_NativeArguments args) {
|
|
|
| void FUNCTION_NAME(Process_Wait)(Dart_NativeArguments args) {
|
| Dart_Handle process = Dart_GetNativeArgument(args, 0);
|
| - intptr_t process_stdin =
|
| + Socket* process_stdin =
|
| Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 1));
|
| - intptr_t process_stdout =
|
| + Socket* process_stdout =
|
| Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 2));
|
| - intptr_t process_stderr =
|
| + Socket* process_stderr =
|
| Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 3));
|
| - intptr_t exit_event =
|
| + Socket* exit_event =
|
| Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 4));
|
| ProcessResult result;
|
| intptr_t pid;
|
| Process::GetProcessIdNativeField(process, &pid);
|
| - if (Process::Wait(pid, process_stdin, process_stdout, process_stderr,
|
| - exit_event, &result)) {
|
| + bool success = Process::Wait(pid, process_stdin->fd(), process_stdout->fd(),
|
| + process_stderr->fd(), exit_event->fd(), &result);
|
| + // Process::Wait() closes the file handles, so blow away the fds in the
|
| + // Sockets so that they don't get picked up by the finalizer on _NativeSocket.
|
| + process_stdin->SetClosedFd();
|
| + process_stdout->SetClosedFd();
|
| + process_stderr->SetClosedFd();
|
| + exit_event->SetClosedFd();
|
| + if (success) {
|
| Dart_Handle out = result.stdout_data();
|
| if (Dart_IsError(out)) {
|
| Dart_PropagateError(out);
|
|
|