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:
parent
4e1b2e73c4
commit
b2321c24dc
@ -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
|
||||
}
|
||||
|
||||
|
@ -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…
x
Reference in New Issue
Block a user