Arquivos
hhvm/hphp/runtime/debugger/cmd/cmd_interrupt.h
T
Mike Magruder f3d5a8abb1 Allow ctrl-c during eval
A client couldn't break execution during eval. There used to be a lot of barriers to making that right, but I fixed most of them with a previous diff on unifying client-side event loops. Now the only barrier was that a server-side thread processing an interrupt was blocking the signal polling thread by holding a mutex while processing the interrupt. Changed to set a flag to disable polling when starting to process the interrupt (and unsetting it when done), while still synchronizing with the signal polling thread to ensure only one thread is sending the client messages at a time. Added logic to re-enable polling while executing PHP for eval, print, etc. Plumbed the proxy thru to the point where we check the clause on conditional breakpoints, too, since that's the third (and final) place we do this.
2013-07-18 17:28:36 -07:00

75 linhas
2.9 KiB
C++

/*
+----------------------------------------------------------------------+
| HipHop for PHP |
+----------------------------------------------------------------------+
| Copyright (c) 2010-2013 Facebook, Inc. (http://www.facebook.com) |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
*/
#ifndef incl_HPHP_EVAL_DEBUGGER_CMD_INTERRUPT_H_
#define incl_HPHP_EVAL_DEBUGGER_CMD_INTERRUPT_H_
#include "hphp/runtime/debugger/debugger_command.h"
#include "hphp/util/process.h"
namespace HPHP { namespace Eval {
///////////////////////////////////////////////////////////////////////////////
DECLARE_BOOST_TYPES(CmdInterrupt);
class CmdInterrupt : public DebuggerCommand {
public:
CmdInterrupt()
: DebuggerCommand(KindOfInterrupt),
m_interrupt(-1), m_threadId(0), m_site(nullptr) {}
CmdInterrupt(InterruptType interrupt, const char *program,
InterruptSite *site, const char *error)
: DebuggerCommand(KindOfInterrupt),
m_interrupt(interrupt), m_program(program ? program : ""),
m_site(site) {
m_threadId = (int64_t)Process::GetThreadId();
if (error) m_errorMsg = error;
}
int64_t getThreadId() const { return m_threadId;}
InterruptType getInterruptType() const { return (InterruptType)m_interrupt;}
std::string desc() const;
std::string error() const { return m_errorMsg;}
virtual void setClientOutput(DebuggerClient &client);
virtual bool onServer(DebuggerProxy &proxy);
bool shouldBreak(DebuggerProxy &proxy, const BreakPointInfoPtrVec &bps,
int stackDepth);
std::string getFileLine() const;
InterruptSite *getSite() { return m_site;}
protected:
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
private:
int16_t m_interrupt;
std::string m_program; // informational only
std::string m_errorMsg; // informational only
int64_t m_threadId;
InterruptSite *m_site; // server side
BreakPointInfoPtr m_bpi; // client side
BreakPointInfoPtrVec m_matched;
};
///////////////////////////////////////////////////////////////////////////////
}}
#endif // incl_HPHP_EVAL_DEBUGGER_CMD_INTERRUPT_H_