From 9603376e2984b20dc48ec270b5e2a2514bbb013d Mon Sep 17 00:00:00 2001 From: "SND\\kernelnet_cp" Date: Tue, 20 Sep 2011 06:49:43 +0000 Subject: [PATCH] [pykd] fixed: TLS problem git-svn-id: https://pykd.svn.codeplex.com/svn@69886 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/dbgext.cpp | 2 +- pykd/pyaux.h | 53 +++++++++++++++++++++++++++++++++++-------------- 2 files changed, 39 insertions(+), 16 deletions(-) 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 + /////////////////////////////////////////////////////////////////////////////// -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(); } };