summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Interpreter/PythonDataObjects.h6
-rw-r--r--lldb/include/lldb/Interpreter/ScriptInterpreterPython.h3
-rw-r--r--lldb/source/Interpreter/ScriptInterpreterPython.cpp6
-rwxr-xr-xlldb/test/dotest.py21
4 files changed, 21 insertions, 15 deletions
diff --git a/lldb/include/lldb/Interpreter/PythonDataObjects.h b/lldb/include/lldb/Interpreter/PythonDataObjects.h
index 63f1ad5f67b..a1145b6f33d 100644
--- a/lldb/include/lldb/Interpreter/PythonDataObjects.h
+++ b/lldb/include/lldb/Interpreter/PythonDataObjects.h
@@ -62,9 +62,11 @@ namespace lldb_private {
{
if (py_obj != m_py_obj)
{
- Py_XDECREF(m_py_obj);
+ if (Py_IsInitialized())
+ Py_XDECREF(m_py_obj);
m_py_obj = py_obj;
- Py_XINCREF(m_py_obj);
+ if (Py_IsInitialized())
+ Py_XINCREF(m_py_obj);
}
return true;
}
diff --git a/lldb/include/lldb/Interpreter/ScriptInterpreterPython.h b/lldb/include/lldb/Interpreter/ScriptInterpreterPython.h
index 3b2758e33c1..187e5aee4a4 100644
--- a/lldb/include/lldb/Interpreter/ScriptInterpreterPython.h
+++ b/lldb/include/lldb/Interpreter/ScriptInterpreterPython.h
@@ -357,7 +357,8 @@ protected:
virtual
~ScriptInterpreterPythonObject()
{
- Py_XDECREF(m_object);
+ if (Py_IsInitialized())
+ Py_XDECREF(m_object);
m_object = NULL;
}
private:
diff --git a/lldb/source/Interpreter/ScriptInterpreterPython.cpp b/lldb/source/Interpreter/ScriptInterpreterPython.cpp
index ec541b14a90..598bab3f8fd 100644
--- a/lldb/source/Interpreter/ScriptInterpreterPython.cpp
+++ b/lldb/source/Interpreter/ScriptInterpreterPython.cpp
@@ -1806,7 +1806,11 @@ ScriptInterpreterPython::Clear ()
Locker locker(this,
ScriptInterpreterPython::Locker::AcquireLock,
ScriptInterpreterPython::Locker::FreeAcquiredLock);
- PyRun_SimpleString("lldb.debugger = None; lldb.target = None; lldb.process = None; lldb.thread = None; lldb.frame = None");
+
+ // This may be called as part of Py_Finalize. In that case the modules are destroyed in random
+ // order and we can't guarantee that we can access these.
+ if (Py_IsInitialized())
+ PyRun_SimpleString("lldb.debugger = None; lldb.target = None; lldb.process = None; lldb.thread = None; lldb.frame = None");
}
bool
diff --git a/lldb/test/dotest.py b/lldb/test/dotest.py
index 49cca982f57..2c31d29460c 100755
--- a/lldb/test/dotest.py
+++ b/lldb/test/dotest.py
@@ -20,7 +20,6 @@ Type:
for available options.
"""
-import atexit
import commands
import os
import errno
@@ -419,7 +418,6 @@ def setupCrashInfoHook():
cmd = "xcrun clang %s -o %s -framework Python -Xlinker -dylib -iframework /System/Library/Frameworks/ -Xlinker -F /System/Library/Frameworks/" % (dylib_src,dylib_dst)
if subprocess.call(cmd,shell=True) == 0 and os.path.exists(dylib_dst):
setCrashInfoHook = setCrashInfoHook_Mac
- atexit.register(deleteCrashInfoDylib,dylib_dst)
else:
pass
@@ -1201,6 +1199,11 @@ def checkDsymForUUIDIsNotOn():
print "Exiting..."
sys.exit(0)
+def exitTestSuite(exitCode = None):
+ lldb.SBDebugger.Terminate()
+ if exitCode:
+ sys.exit(exitCode)
+
# On MacOS X, check to make sure that domain for com.apple.DebugSymbols defaults
# does not exist before proceeding to running the test suite.
if sys.platform.startswith("darwin"):
@@ -1232,11 +1235,7 @@ for testdir in testdirs:
# For the time being, let's bracket the test runner within the
# lldb.SBDebugger.Initialize()/Terminate() pair.
-import lldb, atexit
-# Update: the act of importing lldb now executes lldb.SBDebugger.Initialize(),
-# there's no need to call it a second time.
-#lldb.SBDebugger.Initialize()
-atexit.register(lambda: lldb.SBDebugger.Terminate())
+import lldb
# Create a singleton SBDebugger in the lldb namespace.
lldb.DBG = lldb.SBDebugger.Create()
@@ -1246,7 +1245,7 @@ if lldb_platform_name:
lldb.remote_platform = lldb.SBPlatform(lldb_platform_name)
if not lldb.remote_platform.IsValid():
print "error: unable to create the LLDB platform named '%s'." % (lldb_platform_name)
- sys.exit(1)
+ exitTestSuite(1)
if lldb_platform_url:
# We must connect to a remote platform if a LLDB platform URL was specified
print "Connecting to remote platform '%s' at '%s'..." % (lldb_platform_name, lldb_platform_url)
@@ -1256,7 +1255,7 @@ if lldb_platform_name:
print "Connected."
else:
print "error: failed to connect to remote platform using URL '%s': %s" % (lldb_platform_url, err)
- sys.exit(1)
+ exitTestSuite(1)
if lldb_platform_working_dir:
print "Setting remote platform working directory to '%s'..." % (lldb_platform_working_dir)
@@ -1397,7 +1396,7 @@ if not parsable:
if not compilers or len(compilers) == 0:
print "No eligible compiler found, exiting."
- sys.exit(1)
+ exitTestSuite(1)
if isinstance(compilers, list) and len(compilers) >= 1:
iterCompilers = True
@@ -1738,4 +1737,4 @@ if ("LLDB_TESTSUITE_FORCE_FINISH" in os.environ):
subprocess.Popen(["/bin/sh", "-c", "kill %s; exit 0" % (os.getpid())])
# Exiting.
-sys.exit(failed)
+exitTestSuite() \ No newline at end of file
OpenPOWER on IntegriCloud