diff --git a/pykd/dbgext.cpp b/pykd/dbgext.cpp index 7ab0a0d..9a01a05 100644 --- a/pykd/dbgext.cpp +++ b/pykd/dbgext.cpp @@ -39,7 +39,7 @@ DbgExt *dbgExt = NULL; dbgClient g_dbgClient; // �������� ���������� ���� ������ -__declspec( thread ) PyThreadStatePtr ptrPyThreadState = NULL; +PyThreadStateSaver g_pyThreadState; ////////////////////////////////////////////////////////////////////////////// diff --git a/pykd/pyaux.h b/pykd/pyaux.h index 843dc31..b18cdcb 100644 --- a/pykd/pyaux.h +++ b/pykd/pyaux.h @@ -1,9 +1,41 @@ #pragma once +#include <windows.h> + /////////////////////////////////////////////////////////////////////////////// -typedef PyThreadState *PyThreadStatePtr; -extern __declspec( thread ) PyThreadStatePtr ptrPyThreadState; +class PyThreadStateSaver { + +public: + + PyThreadStateSaver() { + m_index = TlsAlloc(); + } + + ~PyThreadStateSaver() { + TlsFree( m_index ); + } + + void saveState() { + TlsSetValue( m_index, PyEval_SaveThread() ); + } + + void restoreState() { + PyThreadState* state = (PyThreadState*)TlsGetValue( m_index ); + if ( state ) + PyEval_RestoreThread( state ); + } + +private: + + DWORD m_index; +}; + +extern PyThreadStateSaver g_pyThreadState; + + +//typedef PyThreadState *PyThreadStatePtr; +//extern __declspec( thread ) PyThreadStatePtr ptrPyThreadState; // --> call back // { PyThread_StateSave state( winext->getThreadState() ); @@ -19,22 +51,13 @@ class PyThread_StateSave { public: PyThread_StateSave() - : m_bRestored(false) { - if (ptrPyThreadState) - { - PyEval_RestoreThread( ptrPyThreadState ); - m_bRestored = true; - } + g_pyThreadState.restoreState(); } ~PyThread_StateSave() { - if ( m_bRestored ) - ptrPyThreadState = PyEval_SaveThread(); + g_pyThreadState.saveState(); } - -private: - bool m_bRestored; }; // { PyThread_StateRestore state; @@ -46,11 +69,11 @@ class PyThread_StateRestore public: PyThread_StateRestore() { - ptrPyThreadState = PyEval_SaveThread(); + g_pyThreadState.saveState(); } ~PyThread_StateRestore() { - PyEval_RestoreThread( ptrPyThreadState ); + g_pyThreadState.restoreState(); } };