diff --git a/pykd/dbgengine.cpp b/pykd/dbgengine.cpp index 0b48ebc..ff0f031 100644 --- a/pykd/dbgengine.cpp +++ b/pykd/dbgengine.cpp @@ -7,18 +7,35 @@ namespace pykd { +class AutoRestorePyState +{ +public: + + AutoRestorePyState() + { + m_state = PyEval_SaveThread(); + } + + ~AutoRestorePyState() + { + PyEval_RestoreThread( m_state ); + } + +private: + + PyThreadState* m_state; +}; + /////////////////////////////////////////////////////////////////////////////// kdlib::ExecutionStatus targetGo() { kdlib::ExecutionStatus status; - PyThreadState* state = PyEval_SaveThread(); + AutoRestorePyState pystate; status = kdlib::targetGo(); - PyEval_RestoreThread( state ); - return status; } @@ -26,11 +43,9 @@ kdlib::ExecutionStatus targetGo() void targetBreak() { - PyThreadState* state = PyEval_SaveThread(); + AutoRestorePyState pystate; kdlib::targetBreak(); - - PyEval_RestoreThread( state ); } /////////////////////////////////////////////////////////////////////////////// @@ -39,12 +54,10 @@ kdlib::ExecutionStatus targetStep() { kdlib::ExecutionStatus status; - PyThreadState* state = PyEval_SaveThread(); + AutoRestorePyState pystate; status = kdlib::targetStep(); - PyEval_RestoreThread( state ); - return status; } @@ -54,12 +67,10 @@ kdlib::ExecutionStatus targetStepIn() { kdlib::ExecutionStatus status; - PyThreadState* state = PyEval_SaveThread(); + AutoRestorePyState pystate; status = kdlib::targetStepIn(); - PyEval_RestoreThread( state ); - return status; } @@ -69,14 +80,11 @@ kdlib::PROCESS_DEBUG_ID startProcess( const std::wstring &processName ) { kdlib::PROCESS_DEBUG_ID id; - PyThreadState* state = PyEval_SaveThread(); + AutoRestorePyState pystate; id = kdlib::startProcess(processName); - PyEval_RestoreThread( state ); - return id; - } /////////////////////////////////////////////////////////////////////////////// @@ -84,13 +92,11 @@ kdlib::PROCESS_DEBUG_ID startProcess( const std::wstring &processName ) kdlib::PROCESS_DEBUG_ID attachProcess( kdlib::PROCESS_ID pid ) { kdlib::PROCESS_DEBUG_ID id; - - PyThreadState* state = PyEval_SaveThread(); + + AutoRestorePyState pystate; id = kdlib::attachProcess(pid); - PyEval_RestoreThread( state ); - return id; } @@ -98,23 +104,19 @@ kdlib::PROCESS_DEBUG_ID attachProcess( kdlib::PROCESS_ID pid ) void loadDump( const std::wstring &fileName ) { - PyThreadState* state = PyEval_SaveThread(); + AutoRestorePyState pystate; kdlib::loadDump(fileName); - - PyEval_RestoreThread( state ); } /////////////////////////////////////////////////////////////////////////////// std::wstring debugCommand( const std::wstring &command ) { - PyThreadState* state = PyEval_SaveThread(); + AutoRestorePyState pystate; std::wstring outstr = kdlib::debugCommand(command); - PyEval_RestoreThread( state ); - return outstr; } @@ -122,12 +124,10 @@ std::wstring debugCommand( const std::wstring &command ) unsigned long long evaluate( const std::wstring &expression ) { - PyThreadState* state = PyEval_SaveThread(); + AutoRestorePyState pystate; unsigned long long result = kdlib::evaluate(expression); - PyEval_RestoreThread( state ); - return result; }