forked from OSchip/llvm-project
Add Initialize/Terminate method to Platform base plugin
Platform holds a smart pointer to each platform object created in a static variable what cause the platform destructors called only on program exit when other static variables are not availables. With this change the destructors are called on lldb_private::Terminate() + Fix DebuggerRefCount handling in ScriptInterpreterPython Differential Revision: http://reviews.llvm.org/D7590 llvm-svn: 228944
This commit is contained in:
parent
00e305d281
commit
3c4f89d702
|
@ -50,8 +50,14 @@ namespace lldb_private {
|
|||
{
|
||||
public:
|
||||
|
||||
static void
|
||||
Initialize ();
|
||||
|
||||
static void
|
||||
Terminate ();
|
||||
|
||||
//------------------------------------------------------------------
|
||||
/// Get the native host platform plug-in.
|
||||
/// Get the native host platform plug-in.
|
||||
///
|
||||
/// There should only be one of these for each host that LLDB runs
|
||||
/// upon that should be statically compiled in and registered using
|
||||
|
|
|
@ -2825,8 +2825,20 @@ ScriptInterpreterPython::InitializePrivate ()
|
|||
}
|
||||
}
|
||||
|
||||
// Importing 'lldb' module calls SBDebugger::Initialize, which calls Debugger::Initialize, which increments a
|
||||
// global debugger ref-count; therefore we need to check the ref-count before and after importing lldb, and if the
|
||||
// ref-count increased we need to call Debugger::Terminate here to decrement the ref-count so that when the final
|
||||
// call to Debugger::Terminate is made, the ref-count has the correct value.
|
||||
|
||||
int old_count = Debugger::TestDebuggerRefCount ();
|
||||
|
||||
PyRun_SimpleString ("sys.dont_write_bytecode = 1; import lldb.embedded_interpreter; from lldb.embedded_interpreter import run_python_interpreter; from lldb.embedded_interpreter import run_one_line");
|
||||
|
||||
int new_count = Debugger::TestDebuggerRefCount ();
|
||||
|
||||
if (new_count > old_count)
|
||||
Debugger::Terminate ();
|
||||
|
||||
if (threads_already_initialized) {
|
||||
if (log)
|
||||
log->Printf("Releasing PyGILState. Returning to state = %slocked\n", gstate == PyGILState_UNLOCKED ? "un" : "");
|
||||
|
|
|
@ -25,6 +25,8 @@ static uint32_t g_initialize_count = 0;
|
|||
void
|
||||
PlatformAndroid::Initialize ()
|
||||
{
|
||||
PlatformLinux::Initialize ();
|
||||
|
||||
if (g_initialize_count++ == 0)
|
||||
{
|
||||
PluginManager::RegisterPlugin (PlatformAndroid::GetPluginNameStatic(),
|
||||
|
@ -43,6 +45,8 @@ PlatformAndroid::Terminate ()
|
|||
PluginManager::UnregisterPlugin (PlatformAndroid::CreateInstance);
|
||||
}
|
||||
}
|
||||
|
||||
PlatformLinux::Terminate ();
|
||||
}
|
||||
|
||||
PlatformSP
|
||||
|
|
|
@ -118,6 +118,8 @@ static uint32_t g_initialize_count = 0;
|
|||
void
|
||||
PlatformFreeBSD::Initialize ()
|
||||
{
|
||||
Platform::Initialize ();
|
||||
|
||||
if (g_initialize_count++ == 0)
|
||||
{
|
||||
#if defined (__FreeBSD__)
|
||||
|
@ -137,6 +139,8 @@ PlatformFreeBSD::Terminate ()
|
|||
{
|
||||
if (g_initialize_count > 0 && --g_initialize_count == 0)
|
||||
PluginManager::UnregisterPlugin (PlatformFreeBSD::CreateInstance);
|
||||
|
||||
Platform::Terminate ();
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------
|
||||
|
|
|
@ -76,6 +76,8 @@ PlatformKalimba::GetPluginName()
|
|||
void
|
||||
PlatformKalimba::Initialize ()
|
||||
{
|
||||
Platform::Initialize ();
|
||||
|
||||
if (g_initialize_count++ == 0)
|
||||
{
|
||||
PluginManager::RegisterPlugin(PlatformKalimba::GetPluginNameStatic(false),
|
||||
|
@ -94,6 +96,8 @@ PlatformKalimba::Terminate ()
|
|||
PluginManager::UnregisterPlugin (PlatformKalimba::CreateInstance);
|
||||
}
|
||||
}
|
||||
|
||||
Platform::Terminate ();
|
||||
}
|
||||
|
||||
Error
|
||||
|
|
|
@ -242,6 +242,8 @@ PlatformLinux::GetPluginName()
|
|||
void
|
||||
PlatformLinux::Initialize ()
|
||||
{
|
||||
PlatformPOSIX::Initialize ();
|
||||
|
||||
if (g_initialize_count++ == 0)
|
||||
{
|
||||
#if defined(__linux__)
|
||||
|
@ -266,6 +268,8 @@ PlatformLinux::Terminate ()
|
|||
PluginManager::UnregisterPlugin (PlatformLinux::CreateInstance);
|
||||
}
|
||||
}
|
||||
|
||||
PlatformPOSIX::Terminate ();
|
||||
}
|
||||
|
||||
Error
|
||||
|
|
|
@ -51,6 +51,8 @@ static uint32_t g_initialize_count = 0;
|
|||
void
|
||||
PlatformDarwinKernel::Initialize ()
|
||||
{
|
||||
PlatformDarwin::Initialize ();
|
||||
|
||||
if (g_initialize_count++ == 0)
|
||||
{
|
||||
PluginManager::RegisterPlugin (PlatformDarwinKernel::GetPluginNameStatic(),
|
||||
|
@ -70,6 +72,8 @@ PlatformDarwinKernel::Terminate ()
|
|||
PluginManager::UnregisterPlugin (PlatformDarwinKernel::CreateInstance);
|
||||
}
|
||||
}
|
||||
|
||||
PlatformDarwin::Terminate ();
|
||||
}
|
||||
|
||||
PlatformSP
|
||||
|
|
|
@ -40,6 +40,8 @@ static uint32_t g_initialize_count = 0;
|
|||
void
|
||||
PlatformMacOSX::Initialize ()
|
||||
{
|
||||
PlatformDarwin::Initialize ();
|
||||
|
||||
if (g_initialize_count++ == 0)
|
||||
{
|
||||
#if defined (__APPLE__)
|
||||
|
@ -64,6 +66,8 @@ PlatformMacOSX::Terminate ()
|
|||
PluginManager::UnregisterPlugin (PlatformMacOSX::CreateInstance);
|
||||
}
|
||||
}
|
||||
|
||||
PlatformDarwin::Terminate ();
|
||||
}
|
||||
|
||||
PlatformSP
|
||||
|
|
|
@ -63,6 +63,8 @@ static uint32_t g_initialize_count = 0;
|
|||
void
|
||||
PlatformRemoteiOS::Initialize ()
|
||||
{
|
||||
PlatformDarwin::Initialize ();
|
||||
|
||||
if (g_initialize_count++ == 0)
|
||||
{
|
||||
PluginManager::RegisterPlugin (PlatformRemoteiOS::GetPluginNameStatic(),
|
||||
|
@ -81,6 +83,8 @@ PlatformRemoteiOS::Terminate ()
|
|||
PluginManager::UnregisterPlugin (PlatformRemoteiOS::CreateInstance);
|
||||
}
|
||||
}
|
||||
|
||||
PlatformDarwin::Terminate ();
|
||||
}
|
||||
|
||||
PlatformSP
|
||||
|
|
|
@ -41,6 +41,8 @@ static uint32_t g_initialize_count = 0;
|
|||
void
|
||||
PlatformiOSSimulator::Initialize ()
|
||||
{
|
||||
PlatformDarwin::Initialize ();
|
||||
|
||||
if (g_initialize_count++ == 0)
|
||||
{
|
||||
PluginManager::RegisterPlugin (PlatformiOSSimulator::GetPluginNameStatic(),
|
||||
|
@ -59,6 +61,8 @@ PlatformiOSSimulator::Terminate ()
|
|||
PluginManager::UnregisterPlugin (PlatformiOSSimulator::CreateInstance);
|
||||
}
|
||||
}
|
||||
|
||||
PlatformDarwin::Terminate ();
|
||||
}
|
||||
|
||||
PlatformSP
|
||||
|
|
|
@ -146,6 +146,8 @@ PlatformWindows::GetPluginName(void)
|
|||
void
|
||||
PlatformWindows::Initialize(void)
|
||||
{
|
||||
Platform::Initialize ();
|
||||
|
||||
if (g_initialize_count++ == 0)
|
||||
{
|
||||
#if defined (_WIN32)
|
||||
|
@ -175,6 +177,8 @@ PlatformWindows::Terminate( void )
|
|||
PluginManager::UnregisterPlugin (PlatformWindows::CreateInstance);
|
||||
}
|
||||
}
|
||||
|
||||
Platform::Terminate ();
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------
|
||||
|
|
|
@ -40,6 +40,8 @@ static bool g_initialized = false;
|
|||
void
|
||||
PlatformRemoteGDBServer::Initialize ()
|
||||
{
|
||||
Platform::Initialize ();
|
||||
|
||||
if (g_initialized == false)
|
||||
{
|
||||
g_initialized = true;
|
||||
|
@ -57,6 +59,8 @@ PlatformRemoteGDBServer::Terminate ()
|
|||
g_initialized = false;
|
||||
PluginManager::UnregisterPlugin (PlatformRemoteGDBServer::CreateInstance);
|
||||
}
|
||||
|
||||
Platform::Terminate ();
|
||||
}
|
||||
|
||||
PlatformSP
|
||||
|
|
|
@ -29,7 +29,9 @@
|
|||
|
||||
using namespace lldb;
|
||||
using namespace lldb_private;
|
||||
|
||||
|
||||
static uint32_t g_initialize_count = 0;
|
||||
|
||||
// Use a singleton function for g_local_platform_sp to avoid init
|
||||
// constructors since LLDB is often part of a shared library
|
||||
static PlatformSP&
|
||||
|
@ -75,6 +77,25 @@ GetPlatformListMutex ()
|
|||
return g_mutex;
|
||||
}
|
||||
|
||||
void
|
||||
Platform::Initialize ()
|
||||
{
|
||||
g_initialize_count++;
|
||||
}
|
||||
|
||||
void
|
||||
Platform::Terminate ()
|
||||
{
|
||||
if (g_initialize_count > 0)
|
||||
{
|
||||
if (--g_initialize_count == 0)
|
||||
{
|
||||
Mutex::Locker locker(GetPlatformListMutex ());
|
||||
GetPlatformList().clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Platform::SetHostPlatform (const lldb::PlatformSP &platform_sp)
|
||||
{
|
||||
|
|
|
@ -313,6 +313,7 @@ lldb_private::Terminate ()
|
|||
ProcessFreeBSD::Terminate();
|
||||
#endif
|
||||
|
||||
PlatformRemoteGDBServer::Terminate();
|
||||
ProcessGDBRemote::Terminate();
|
||||
DynamicLoaderStatic::Terminate();
|
||||
|
||||
|
|
Loading…
Reference in New Issue