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>
This commit is contained in:
Bartosz Sosnowski 2016-12-12 12:02:10 +01:00 committed by João Reis
parent 4e1b2e73c4
commit b2321c24dc
2 changed files with 11 additions and 3 deletions

View File

@ -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
}

View File

@ -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
};