Browse Source

watchdog: add flag to mark handler as disabled

Adds flags that marks WinCtrlCHandlerRoutine as disabled instead of
removing it. Trying to remove the controller from the controller
handle itself leads to deadlock.

PR-URL: https://github.com/nodejs/node/pull/10248
Reviewed-By: Anna Henningsen <anna@addaleax.net>
v7.x
Bartosz Sosnowski 8 years ago
committed by Evan Lucas
parent
commit
ba46374cb9
  1. 13
      src/node_watchdog.cc
  2. 1
      src/node_watchdog.h

13
src/node_watchdog.cc

@ -150,7 +150,8 @@ void SigintWatchdogHelper::HandleSignal(int signum) {
// Windows starts a separate thread for executing the handler, so no extra
// helper thread is required.
BOOL WINAPI SigintWatchdogHelper::WinCtrlCHandlerRoutine(DWORD dwCtrlType) {
if (dwCtrlType == CTRL_C_EVENT || dwCtrlType == CTRL_BREAK_EVENT) {
if (!instance.watchdog_disabled_ &&
(dwCtrlType == CTRL_C_EVENT || dwCtrlType == CTRL_BREAK_EVENT)) {
InformWatchdogsAboutSignal();
// Return true because the signal has been handled.
@ -207,7 +208,11 @@ int SigintWatchdogHelper::Start() {
RegisterSignalHandler(SIGINT, HandleSignal);
#else
SetConsoleCtrlHandler(WinCtrlCHandlerRoutine, TRUE);
if (watchdog_disabled_) {
watchdog_disabled_ = false;
} else {
SetConsoleCtrlHandler(WinCtrlCHandlerRoutine, TRUE);
}
#endif
return 0;
@ -251,7 +256,7 @@ bool SigintWatchdogHelper::Stop() {
RegisterSignalHandler(SIGINT, SignalExit, true);
#else
SetConsoleCtrlHandler(WinCtrlCHandlerRoutine, FALSE);
watchdog_disabled_ = true;
#endif
had_pending_signal = has_pending_signal_;
@ -292,6 +297,8 @@ SigintWatchdogHelper::SigintWatchdogHelper()
has_running_thread_ = false;
stopping_ = false;
CHECK_EQ(0, uv_sem_init(&sem_, 0));
#else
watchdog_disabled_ = false;
#endif
}

1
src/node_watchdog.h

@ -91,6 +91,7 @@ class SigintWatchdogHelper {
static void* RunSigintWatchdog(void* arg);
static void HandleSignal(int signum);
#else
bool watchdog_disabled_;
static BOOL WINAPI WinCtrlCHandlerRoutine(DWORD dwCtrlType);
#endif
};

Loading…
Cancel
Save