| Index: runtime/bin/process_win.cc
|
| diff --git a/runtime/bin/process_win.cc b/runtime/bin/process_win.cc
|
| index 21c7ae44e9b3cbc840a070c74475f9a31e67d1ba..bcf0c79dc80d8557b1ae59d48b8b4247967110aa 100644
|
| --- a/runtime/bin/process_win.cc
|
| +++ b/runtime/bin/process_win.cc
|
| @@ -1043,7 +1043,7 @@ intptr_t Process::SetSignalHandler(intptr_t signal) {
|
| }
|
|
|
|
|
| -void Process::ClearSignalHandler(intptr_t signal) {
|
| +void Process::ClearSignalHandler(intptr_t signal, Dart_Port port) {
|
| signal = GetWinSignal(signal);
|
| if (signal == -1) {
|
| return;
|
| @@ -1051,24 +1051,27 @@ void Process::ClearSignalHandler(intptr_t signal) {
|
| 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();
|
| + bool remove = false;
|
| + if (handler->signal() == signal) {
|
| + if ((port == ILLEGAL_PORT) || (handler->port() == port)) {
|
| + if (signal_handlers == handler) {
|
| + signal_handlers = handler->next();
|
| + }
|
| + handler->Unlink();
|
| + FileHandle* file_handle = reinterpret_cast<FileHandle*>(handler->fd());
|
| + file_handle->Release();
|
| + remove = true;
|
| + }
|
| }
|
| - if (signal_handlers == NULL) {
|
| - USE(SetConsoleCtrlHandler(SignalHandler, false));
|
| + SignalInfo* next = handler->next();
|
| + if (remove) {
|
| + delete handler;
|
| }
|
| - FileHandle* file_handle = reinterpret_cast<FileHandle*>(handler->fd());
|
| - file_handle->Release();
|
| + handler = next;
|
| + }
|
| + if (signal_handlers == NULL) {
|
| + USE(SetConsoleCtrlHandler(SignalHandler, false));
|
| }
|
| - delete handler;
|
| }
|
|
|
| } // namespace bin
|
|
|