summaryrefslogtreecommitdiffstats
path: root/lldb/packages/Python/lldbsuite/test/api/multiple-targets/TestMultipleTargets.py
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2016-12-09 01:21:14 +0000
committerGreg Clayton <gclayton@apple.com>2016-12-09 01:21:14 +0000
commit7904046c33d8c8a24e1d78303bf0ebc61d7d9ef1 (patch)
tree9369d32b2747e41bfe1e2d9843cb028d9068e043 /lldb/packages/Python/lldbsuite/test/api/multiple-targets/TestMultipleTargets.py
parent867e7d17655367377137393ea7d2fa68268d3001 (diff)
downloadbcm5719-llvm-7904046c33d8c8a24e1d78303bf0ebc61d7d9ef1.tar.gz
bcm5719-llvm-7904046c33d8c8a24e1d78303bf0ebc61d7d9ef1.zip
Calling SBDebugger::CeeateTarget being called on multiple threads was crashing LLDB.
I found the race condition in: ScriptInterpreter *CommandInterpreter::GetScriptInterpreter(bool can_create); More than one "ScriptInterpreter *" was being returned due to the race which caused any clients with the first one to now be pointing to freed memory and we would quickly crash. Added a test to catch this so we don't regress. <rdar://problem/28356584> llvm-svn: 289169
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test/api/multiple-targets/TestMultipleTargets.py')
-rw-r--r--lldb/packages/Python/lldbsuite/test/api/multiple-targets/TestMultipleTargets.py39
1 files changed, 39 insertions, 0 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/api/multiple-targets/TestMultipleTargets.py b/lldb/packages/Python/lldbsuite/test/api/multiple-targets/TestMultipleTargets.py
new file mode 100644
index 00000000000..54e7b83c680
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/api/multiple-targets/TestMultipleTargets.py
@@ -0,0 +1,39 @@
+"""Test the lldb public C++ api when creating multiple targets simultaneously."""
+
+from __future__ import print_function
+
+
+import os
+import re
+import subprocess
+
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestMultipleSimultaneousDebuggers(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @skipIfNoSBHeaders
+ def test_multiple_debuggers(self):
+ env = {self.dylibPath: self.getLLDBLibraryEnvVal()}
+
+ self.driver_exe = os.path.join(os.getcwd(), "multi-target")
+ self.buildDriver('main.cpp', self.driver_exe)
+ self.addTearDownHook(lambda: os.remove(self.driver_exe))
+ self.signBinary(self.driver_exe)
+
+# check_call will raise a CalledProcessError if multi-process-driver doesn't return
+# exit code 0 to indicate success. We can let this exception go - the test harness
+# will recognize it as a test failure.
+
+ if self.TraceOn():
+ print("Running test %s" % self.driver_exe)
+ check_call([self.driver_exe, self.driver_exe], env=env)
+ else:
+ with open(os.devnull, 'w') as fnull:
+ check_call([self.driver_exe, self.driver_exe],
+ env=env, stdout=fnull, stderr=fnull)
OpenPOWER on IntegriCloud