[pykd] updated : support for GIL in callback

git-svn-id: https://pykd.svn.codeplex.com/svn@69009 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\kernelnet_cp 2011-08-15 14:23:25 +00:00
parent 05ffa0ece2
commit 9e5fe5cab5
7 changed files with 102 additions and 158 deletions

View File

@ -4,6 +4,7 @@
#include "dbgbreak.h"
#include "dbgexcept.h"
#include "pyaux.h"
///////////////////////////////////////////////////////////////////////////////
@ -13,6 +14,8 @@ dbgBreakpointClass::breakpointMap dbgBreakpointClass::m_breakMap;
HRESULT dbgBreakpointClass::onBreakpointEvnet( IDebugBreakpoint* bp )
{
PyThread_StateSave( dbgExt->getThreadState() );
try {
breakpointMap::iterator it = m_breakMap.find( bp );

View File

@ -2,6 +2,7 @@
#include <string>
#include <map>
#include "pyaux.h"
/////////////////////////////////////////////////////////////////////////////////
@ -25,11 +26,12 @@ setExecutionStatus()
do {
Py_BEGIN_ALLOW_THREADS
{
PyThread_StateRestore state;
hres = dbgExt->control->WaitForEvent( 0, INFINITE );
Py_END_ALLOW_THREADS
}
if ( FAILED( hres ) )
throw DbgException( "IDebugControl::SetExecutionStatus failed" );

View File

@ -6,6 +6,7 @@
#include "dbgevent.h"
#include "dbgio.h"
#include "dbgexcept.h"
#include "pyaux.h"
///////////////////////////////////////////////////////////////////////////////////
@ -68,6 +69,8 @@ HRESULT debugEvent::LoadModule(
dbgModuleClass module(moduleName, moduleBase, moduleSize);
silentMode.reset();
PyThread_StateSave( dbgExt->getThreadState() );
return onLoadModule( module );
}
@ -88,6 +91,8 @@ HRESULT debugEvent::UnloadModule(
dbgModuleClass module(moduleName, moduleBase, moduleSize);
silentMode.reset();
PyThread_StateSave( dbgExt->getThreadState() );
return onUnloadModule( module );
}
@ -97,6 +102,8 @@ HRESULT debugEvent::SessionStatus(
__in ULONG Status
)
{
PyThread_StateSave( dbgExt->getThreadState() );
return onChangeSessionStatus( Status );
}
@ -107,159 +114,10 @@ HRESULT debugEvent::ChangeDebuggeeState(
__in ULONG64 Argument
)
{
PyThread_StateSave( dbgExt->getThreadState() );
return onChangeDebugeeState();
}
///////////////////////////////////////////////////////////////////////////////////
//
// STDMETHOD(GetInterestMask)(
// __out PULONG Mask
// );
//
// STDMETHOD(LoadModule)(
// __in ULONG64 ImageFileHandle,
// __in ULONG64 BaseOffset,
// __in ULONG ModuleSize,
// __in PCSTR ModuleName,
// __in PCSTR ImageName,
// __in ULONG CheckSum,
// __in ULONG TimeDateStamp
// );
//
// STDMETHOD(UnloadModule)(
// __in PCSTR ImageBaseName,
// __in ULONG64 BaseOffset
// );
//
//public:
//
// ULONG onLoadModule(const dbgModuleClass &module);
//
// ULONG onUnloadModule(const dbgModuleClass &module);
//
//#include <memory>
//#include <dbgeng.h>
//
//#include "dbgmodule.h"
//#include "dbgio.h"
//#include "dbgevent.h"
//
///////////////////////////////////////////////////////////////////////////////////
//
//debugEvent::modCallbacksColl debugEvent::modCallbacks;
//debugEvent::modCallbacksLock debugEvent::modCallbacksMtx;
//
///////////////////////////////////////////////////////////////////////////////////
//
//debugEvent::debugEvent()
//{
// modCallbacksScopedLock lock(modCallbacksMtx);
// modCallbacks.insert(this);
//}
//
///////////////////////////////////////////////////////////////////////////////////
//
//debugEvent::~debugEvent()
//{
// modCallbacksScopedLock lock(modCallbacksMtx);
// modCallbacks.erase(this);
//}
//
///////////////////////////////////////////////////////////////////////////////////
//
//ULONG debugEvent::moduleLoaded(__in ULONG64 addr)
//{
// modCallbacksScopedLock lock(modCallbacksMtx);
// if (modCallbacks.empty())
// return DEBUG_STATUS_NO_CHANGE;
//
// ULONG64 moduleBase;
// ULONG moduleSize;
// std::string moduleName;
//
// std::auto_ptr<OutputReader> silentMode( new OutputReader(dbgExt->client) );
// queryModuleParams(addr, moduleName, moduleBase, moduleSize);
// dbgModuleClass module(moduleName, moduleBase, moduleSize);
// silentMode.reset();
//
// modCallbacksColl::iterator itCallback = modCallbacks.begin();
// while (itCallback != modCallbacks.end())
// {
// const ULONG retValue = (*itCallback)->onLoadModule(module);
// if (DEBUG_STATUS_NO_CHANGE != retValue)
// return retValue;
//
// ++itCallback;
// }
// return DEBUG_STATUS_NO_CHANGE;
//}
//
///////////////////////////////////////////////////////////////////////////////////
//
//ULONG debugEvent::moduleUnloaded(__in ULONG64 addr)
//{
// modCallbacksScopedLock lock(modCallbacksMtx);
// if (modCallbacks.empty())
// return DEBUG_STATUS_NO_CHANGE;
//
// ULONG64 moduleBase;
// ULONG moduleSize;
// std::string moduleName;
//
// std::auto_ptr<OutputReader> silentMode( new OutputReader(dbgExt->client) );
// queryModuleParams(addr, moduleName, moduleBase, moduleSize);
// dbgModuleClass module(moduleName, moduleBase, moduleSize);
// silentMode.reset();
//
// modCallbacksColl::iterator itCallback = modCallbacks.begin();
// while (itCallback != modCallbacks.end())
// {
// const ULONG retValue = (*itCallback)->onUnloadModule(module);
// if (DEBUG_STATUS_NO_CHANGE != retValue)
// return retValue;
//
// ++itCallback;
// }
// return DEBUG_STATUS_NO_CHANGE;
//}
//
///////////////////////////////////////////////////////////////////////////////////
//
//ULONG debugEvent::sessionStatus(__in ULONG status )
//{
//
//}
//
///////////////////////////////////////////////////////////////////////////////////
//
//ULONG debugEventWrap::onLoadModule(const dbgModuleClass &module)
//{
// if (boost::python::override override = get_override("onLoadModule"))
// return override(module);
//
// return debugEvent::onLoadModule(module);
//}
//
///////////////////////////////////////////////////////////////////////////////////
//
//ULONG debugEventWrap::onUnloadModule(const dbgModuleClass &module)
//{
// if (boost::python::override override = get_override("onUnloadModule"))
// return override(module);
//
// return debugEvent::onUnloadModule(module);
//}
//
///////////////////////////////////////////////////////////////////////////////////

View File

@ -692,6 +692,8 @@ DebugExtensionUninitialize()
DbgExt::DbgExt( IDebugClient4 *masterClient )
{
m_threadState = NULL;
client = NULL;
masterClient->QueryInterface( __uuidof(IDebugClient), (void **)&client );

View File

@ -32,9 +32,16 @@ public:
~DbgExt();
PyThreadState**
getThreadState() {
return &m_threadState;
}
private:
DbgExt *m_previosExt;
PyThreadState *m_threadState;
};
extern DbgExt *dbgExt;

68
pykd/pyaux.h Normal file
View File

@ -0,0 +1,68 @@
#pragma once
///////////////////////////////////////////////////////////////////////////////
// --> call back
// { PyThread_StateSave state( winext->getThreadState() );
// do_callback();
// }
//
// Ĺńëč ęîëáĺę áűë âűçâŕí č ďđč ýňîě ó ňĺęůĺăî ďîňîęŕ ńîőđŕíĺí ęîíňĺęńň ( áűë âűçîâ setExecutionStatus )
// ňî ďĺđĺä âűďîëíĺíčĺě ďčňîíîâńęîăî ęîäŕ íóćíî âîńńňŕíîâčňü ęîíňĺęńň, ŕ ďîńëĺ âîçâđŕňŕ óďđŕâëĺíč˙,
// ńíîâŕ ńîőđŕíčňü ĺăî
class PyThread_StateSave {
public:
PyThread_StateSave( PyThreadState **state ) {
if ( *state != NULL )
{
m_state = state;
PyEval_RestoreThread( *m_state );
}
}
~PyThread_StateSave() {
*m_state =PyEval_SaveThread();
}
private:
PyThreadState **m_state;
};
// { PyThread_StateRestore state;
// long_or_block_opreration();
// }
class PyThread_StateRestore {
public:
explicit PyThread_StateRestore() {
m_state = &m_ownState;
*m_state =PyEval_SaveThread();
}
PyThread_StateRestore( PyThreadState **state ) {
if ( *state != NULL )
{
m_state = state;
*m_state =PyEval_SaveThread();
}
}
~PyThread_StateRestore() {
PyEval_RestoreThread( *m_state );
}
private:
PyThreadState **m_state;
PyThreadState *m_ownState;
};
///////////////////////////////////////////////////////////////////////////////

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="windows-1251"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Version="9,00"
Name="pykd"
ProjectGUID="{FE961905-666F-4908-A212-961465F46F13}"
RootNamespace="pykd"
@ -551,6 +551,10 @@
RelativePath=".\intbase.h"
>
</File>
<File
RelativePath=".\pyaux.h"
>
</File>
<File
RelativePath=".\resource.h"
>