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:
Tamas Berghammer 2015-02-12 18:18:27 +00:00
parent 00e305d281
commit 3c4f89d702
14 changed files with 82 additions and 2 deletions

View File

@ -50,6 +50,12 @@ namespace lldb_private {
{
public:
static void
Initialize ();
static void
Terminate ();
//------------------------------------------------------------------
/// Get the native host platform plug-in.
///

View File

@ -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" : "");

View File

@ -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

View File

@ -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 ();
}
//------------------------------------------------------------------

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 ();
}
//------------------------------------------------------------------

View File

@ -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

View File

@ -30,6 +30,8 @@
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)
{

View File

@ -313,6 +313,7 @@ lldb_private::Terminate ()
ProcessFreeBSD::Terminate();
#endif
PlatformRemoteGDBServer::Terminate();
ProcessGDBRemote::Terminate();
DynamicLoaderStatic::Terminate();