Skip to content

Commit

Permalink
watchdog: add flag to mark handler as disabled
Browse files Browse the repository at this point in the history
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: #10248
Reviewed-By: Anna Henningsen <anna@addaleax.net>
  • Loading branch information
bzoz authored and MylesBorins committed Jan 31, 2017
1 parent f7c0eb8 commit 9eaf2e9
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 3 deletions.
13 changes: 10 additions & 3 deletions src/node_watchdog.cc
Expand Up @@ -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.
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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_;
Expand Down Expand Up @@ -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
}

Expand Down
1 change: 1 addition & 0 deletions src/node_watchdog.h
Expand Up @@ -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
};
Expand Down

0 comments on commit 9eaf2e9

Please sign in to comment.