diff --git a/hphp/runtime/base/runtime_option.cpp b/hphp/runtime/base/runtime_option.cpp index c4fdbd1b6..3942c5139 100644 --- a/hphp/runtime/base/runtime_option.cpp +++ b/hphp/runtime/base/runtime_option.cpp @@ -451,6 +451,7 @@ std::string RuntimeOption::DebuggerRpcHostDomain; int RuntimeOption::DebuggerDefaultRpcTimeout = 30; std::string RuntimeOption::DebuggerDefaultSandboxPath; std::string RuntimeOption::DebuggerStartupDocument; +int RuntimeOption::DebuggerSignalTimeout = 1; std::string RuntimeOption::SendmailPath; std::string RuntimeOption::MailForceExtraParameters; @@ -1202,6 +1203,7 @@ void RuntimeOption::Load(Hdf &config, StringVec *overwrites /* = NULL */, DebuggerServerPort = debugger["Port"].getUInt16(8089); DebuggerDefaultSandboxPath = debugger["DefaultSandboxPath"].getString(); DebuggerStartupDocument = debugger["StartupDocument"].getString(); + DebuggerSignalTimeout = debugger["SignalTimeout"].getInt32(1); DebuggerDefaultRpcPort = debugger["RPC.DefaultPort"].getUInt16(8083); DebuggerDefaultRpcAuth = debugger["RPC.DefaultAuth"].getString(); diff --git a/hphp/runtime/base/runtime_option.h b/hphp/runtime/base/runtime_option.h index ffbe85a7c..7b9d9a22a 100644 --- a/hphp/runtime/base/runtime_option.h +++ b/hphp/runtime/base/runtime_option.h @@ -508,6 +508,7 @@ public: static int DebuggerDefaultRpcTimeout; static std::string DebuggerDefaultSandboxPath; static std::string DebuggerStartupDocument; + static int DebuggerSignalTimeout; // Mail options static std::string SendmailPath; diff --git a/hphp/runtime/debugger/debugger_proxy.cpp b/hphp/runtime/debugger/debugger_proxy.cpp index e1d34314d..6c5739279 100644 --- a/hphp/runtime/debugger/debugger_proxy.cpp +++ b/hphp/runtime/debugger/debugger_proxy.cpp @@ -306,14 +306,15 @@ void DebuggerProxy::startSignalThread() { // it will be passed to the dummy sandbox instead. void DebuggerProxy::pollSignal() { TRACE_RB(2, "DebuggerProxy::pollSignal: starting\n"); + int signalTimeout = RuntimeOption::DebuggerSignalTimeout; while (!m_stopped) { sleep(1); - // after 1 second that no active thread picks up the signal, we send it - // to dummy sandbox - if (m_signum != CmdSignal::SignalNone && m_dummySandbox) { + // After DebuggerSignalTimeout seconds that no active thread picks + // up the signal, we send it to dummy sandbox. + if ((m_signum != CmdSignal::SignalNone) && m_dummySandbox) { Lock lock(m_signumMutex); - if (m_signum != CmdSignal::SignalNone) { + if ((m_signum != CmdSignal::SignalNone) && (--signalTimeout <= 0)) { TRACE_RB(2, "DebuggerProxy::pollSignal: sending to dummy sandbox\n"); m_dummySandbox->notifySignal(m_signum); m_signum = CmdSignal::SignalNone; @@ -362,11 +363,13 @@ void DebuggerProxy::pollSignal() { break; } - m_signum = sig->getSignal(); + auto newSignum = sig->getSignal(); - if (m_signum != CmdSignal::SignalNone) { + if (newSignum != CmdSignal::SignalNone) { TRACE_RB(2, "DebuggerProxy::pollSignal: " "got interrupt signal from client\n"); + m_signum = newSignum; + signalTimeout = RuntimeOption::DebuggerSignalTimeout; Debugger::RequestInterrupt(shared_from_this()); } } diff --git a/hphp/test/ext/config-debugger-server.hdf b/hphp/test/ext/config-debugger-server.hdf index 2e51ef2f5..c809bcb29 100644 --- a/hphp/test/ext/config-debugger-server.hdf +++ b/hphp/test/ext/config-debugger-server.hdf @@ -15,6 +15,7 @@ Eval { EnableDebugger = true EnableDebuggerServer = true StartupDocument = hphpd_startup.php + SignalTimeout = 3 } }