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 evanlucas committed Jan 4, 2017
1 parent a2ec794 commit ba46374
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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 ba46374

Please sign in to comment.