aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Devlieghere <jonas@devlieghere.com>2020-12-07 20:59:13 -0800
committerJonas Devlieghere <jonas@devlieghere.com>2020-12-09 08:58:40 -0800
commit5861234e72c035ad39b5fd843eef78ab4039351e (patch)
treea4b493dac2d833f4878ae88a6fd51f6cf65182fa
parentfed7565ee2172fbb77c22b2362c76ffc1fdf39d7 (diff)
downloadllvm-project-5861234e72c035ad39b5fd843eef78ab4039351e.tar.gz
[lldb] Track the API boundary using a thread_local variable.
The reproducers currently use a static variable to track the API boundary. This is obviously incorrect when the SB API is used concurrently. While I do not plan to support that use-case (right now), I do want to avoid us crashing. As a first step, correctly track API boundaries across multiple threads. Before this patch SB API calls made by the embedded script interpreter would be considered "behind the API boundary" and correctly ignored. After this patch, we need to tell the reproducers to ignore the scripting thread as a "private thread". Differential revision: https://reviews.llvm.org/D92811
-rw-r--r--lldb/include/lldb/Utility/ReproducerInstrumentation.h6
-rw-r--r--lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp2
-rw-r--r--lldb/source/Utility/ReproducerInstrumentation.cpp2
3 files changed, 8 insertions, 2 deletions
diff --git a/lldb/include/lldb/Utility/ReproducerInstrumentation.h b/lldb/include/lldb/Utility/ReproducerInstrumentation.h
index 8e319d749231..e4c31522c4fc 100644
--- a/lldb/include/lldb/Utility/ReproducerInstrumentation.h
+++ b/lldb/include/lldb/Utility/ReproducerInstrumentation.h
@@ -841,6 +841,10 @@ public:
bool ShouldCapture() { return m_local_boundary; }
+ /// Mark the current thread as a private thread and pretend that everything
+ /// on this thread is behind happening behind the API boundary.
+ static void PrivateThread() { g_global_boundary = true; }
+
private:
template <typename T> friend struct replay;
void UpdateBoundary() {
@@ -868,7 +872,7 @@ private:
bool m_result_recorded;
/// Whether we're currently across the API boundary.
- static bool g_global_boundary;
+ static thread_local bool g_global_boundary;
};
/// To be used as the "Runtime ID" of a constructor. It also invokes the
diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
index 0d13884e8089..5f950d42cac6 100644
--- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
+++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
@@ -33,6 +33,7 @@
#include "lldb/Interpreter/CommandReturnObject.h"
#include "lldb/Target/Thread.h"
#include "lldb/Target/ThreadPlan.h"
+#include "lldb/Utility/ReproducerInstrumentation.h"
#include "lldb/Utility/Timer.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringRef.h"
@@ -437,6 +438,7 @@ ScriptInterpreterPythonImpl::Locker::Locker(
: ScriptInterpreterLocker(),
m_teardown_session((on_leave & TearDownSession) == TearDownSession),
m_python_interpreter(py_interpreter) {
+ repro::Recorder::PrivateThread();
DoAcquireLock();
if ((on_entry & InitSession) == InitSession) {
if (!DoInitSession(on_entry, in, out, err)) {
diff --git a/lldb/source/Utility/ReproducerInstrumentation.cpp b/lldb/source/Utility/ReproducerInstrumentation.cpp
index 09aea69d8313..626120c9d71a 100644
--- a/lldb/source/Utility/ReproducerInstrumentation.cpp
+++ b/lldb/source/Utility/ReproducerInstrumentation.cpp
@@ -227,4 +227,4 @@ llvm::Optional<InstrumentationData> &InstrumentationData::InstanceImpl() {
return g_instrumentation_data;
}
-bool lldb_private::repro::Recorder::g_global_boundary;
+thread_local bool lldb_private::repro::Recorder::g_global_boundary = false;