Index: runtime/bin/process_win.cc |
diff --git a/runtime/bin/process_win.cc b/runtime/bin/process_win.cc |
index 75524b395ed70bbf4e959985a83738308faef420..00514c775a60d437ea6a69daae7ce44ada2dab59 100644 |
--- a/runtime/bin/process_win.cc |
+++ b/runtime/bin/process_win.cc |
@@ -11,7 +11,6 @@ |
#include "bin/process.h" |
#include "bin/eventhandler.h" |
#include "bin/log.h" |
-#include "bin/socket.h" |
#include "bin/thread.h" |
#include "bin/utils.h" |
#include "bin/utils_win.h" |
@@ -350,7 +349,27 @@ static bool EnsureInitialized() { |
return delete_proc_thread_attr_list != NULL; |
} |
-int GenerateNames(int count, wchar_t* pipe_names[], int max_length) { |
+ |
+int Process::Start(const char* path, |
+ char* arguments[], |
+ intptr_t arguments_length, |
+ const char* working_directory, |
+ char* environment[], |
+ intptr_t environment_length, |
+ intptr_t* in, |
+ intptr_t* out, |
+ intptr_t* err, |
+ intptr_t* id, |
+ intptr_t* exit_handler, |
+ char** os_error_message) { |
+ HANDLE stdin_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; |
+ HANDLE stdout_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; |
+ HANDLE stderr_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; |
+ HANDLE exit_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; |
+ |
+ // Generate unique pipe names for the four named pipes needed. |
+ static const int kMaxPipeNameSize = 80; |
+ wchar_t pipe_names[4][kMaxPipeNameSize]; |
UUID uuid; |
RPC_STATUS status = UuidCreateSequential(&uuid); |
if (status != RPC_S_OK && status != RPC_S_UUID_LOCAL_ONLY) { |
@@ -365,10 +384,10 @@ int GenerateNames(int count, wchar_t* pipe_names[], int max_length) { |
Log::PrintErr("UuidToString failed %d\n", status); |
return status; |
} |
- for (int i = 0; i < count; i++) { |
+ for (int i = 0; i < 4; i++) { |
static const wchar_t* prefix = L"\\\\.\\Pipe\\dart"; |
_snwprintf(pipe_names[i], |
- max_length, |
+ kMaxPipeNameSize, |
L"%s_%s_%d", prefix, uuid_string, i + 1); |
} |
status = RpcStringFreeW(&uuid_string); |
@@ -377,32 +396,6 @@ int GenerateNames(int count, wchar_t* pipe_names[], int max_length) { |
Log::PrintErr("RpcStringFree failed %d\n", status); |
return status; |
} |
- return 0; |
-} |
- |
- |
-int Process::Start(const char* path, |
- char* arguments[], |
- intptr_t arguments_length, |
- const char* working_directory, |
- char* environment[], |
- intptr_t environment_length, |
- intptr_t* in, |
- intptr_t* out, |
- intptr_t* err, |
- intptr_t* id, |
- intptr_t* exit_handler, |
- char** os_error_message) { |
- HANDLE stdin_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; |
- HANDLE stdout_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; |
- HANDLE stderr_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; |
- HANDLE exit_handles[2] = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE }; |
- |
- // Generate unique pipe names for the four named pipes needed. |
- static const int kMaxPipeNameSize = 80; |
- wchar_t pipe_names[4][kMaxPipeNameSize]; |
- int status = GenerateNames(4, pipe_names, kMaxPipeNameSize); |
- if (status != 0) return status; |
if (!CreateProcessPipe(stdin_handles, pipe_names[0], kInheritRead)) { |
int error_code = SetOsErrorMessage(os_error_message); |
@@ -856,105 +849,6 @@ intptr_t Process::CurrentProcessId() { |
return static_cast<intptr_t>(GetCurrentProcessId()); |
} |
- |
-static SignalInfo* signal_handlers = NULL; |
-static Mutex* signal_mutex = new Mutex(); |
- |
- |
-SignalInfo::~SignalInfo() { |
- reinterpret_cast<FileHandle*>(fd_)->Close(); |
-} |
- |
- |
-BOOL WINAPI SignalHandler(DWORD signal) { |
- MutexLocker lock(signal_mutex); |
- const SignalInfo* handler = signal_handlers; |
- bool handled = false; |
- while (handler != NULL) { |
- if (handler->signal() == signal) { |
- int value = 0; |
- Socket::Write(handler->fd(), &value, 1); |
- handled = true; |
- } |
- handler = handler->next(); |
- } |
- return handled; |
-} |
- |
- |
-intptr_t GetWinSignal(intptr_t signal) { |
- switch (signal) { |
- case 1: // SIGHUP |
- return CTRL_CLOSE_EVENT; |
- case 2: // SIGINT |
- return CTRL_C_EVENT; |
- default: |
- return -1; |
- } |
-} |
- |
- |
-intptr_t Process::SetSignalHandler(intptr_t signal) { |
- signal = GetWinSignal(signal); |
- if (signal == -1) return -1; |
- |
- // Generate a unique pipe name for the named pipe. |
- static const int kMaxPipeNameSize = 80; |
- wchar_t pipe_name[kMaxPipeNameSize]; |
- GenerateNames(1, &pipe_name, kMaxPipeNameSize); |
- if (status != 0) return status; |
- |
- HANDLE fds[2]; |
- if (!CreateProcessPipe(fds, pipe_name, kInheritNone)) { |
- int error_code = GetLastError(); |
- CloseProcessPipe(fds); |
- SetLastError(error_code); |
- return -1; |
- } |
- MutexLocker lock(signal_mutex); |
- FileHandle* write_handle = new FileHandle(fds[kWriteHandle]); |
- write_handle->EnsureInitialized(EventHandler::delegate()); |
- intptr_t write_fd = reinterpret_cast<intptr_t>(write_handle); |
- if (signal_handlers == NULL) { |
- if (SetConsoleCtrlHandler(SignalHandler, true) == 0) { |
- int error_code = GetLastError(); |
- delete write_handle; |
- CloseProcessPipe(fds); |
- SetLastError(error_code); |
- return -1; |
- } |
- signal_handlers = new SignalInfo(write_fd, signal); |
- } else { |
- new SignalInfo(write_fd, signal, signal_handlers); |
- } |
- return reinterpret_cast<intptr_t>(new FileHandle(fds[kReadHandle])); |
-} |
- |
- |
-void Process::ClearSignalHandler(intptr_t signal) { |
- signal = GetWinSignal(signal); |
- if (signal == -1) return; |
- MutexLocker lock(signal_mutex); |
- SignalInfo* handler = signal_handlers; |
- while (handler != NULL) { |
- if (handler->port() == Dart_GetMainPortId() && |
- handler->signal() == signal) { |
- handler->Unlink(); |
- break; |
- } |
- handler = handler->next(); |
- } |
- if (handler != NULL) { |
- if (signal_handlers == handler) { |
- signal_handlers = handler->next(); |
- } |
- if (signal_handlers == NULL) { |
- USE(SetConsoleCtrlHandler(SignalHandler, false)); |
- } |
- } |
- delete handler; |
-} |
- |
} // namespace bin |
} // namespace dart |