Skip to content

Commit

Permalink
[lldb] Track the API boundary using a thread_local variable.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
JDevlieghere committed Dec 9, 2020
1 parent fed7565 commit 5861234
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 2 deletions.
6 changes: 5 additions & 1 deletion lldb/include/lldb/Utility/ReproducerInstrumentation.h
Expand Up @@ -841,6 +841,10 @@ class Recorder {

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() {
Expand Down Expand Up @@ -868,7 +872,7 @@ class Recorder {
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
Expand Down
Expand Up @@ -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"
Expand Down Expand Up @@ -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)) {
Expand Down
2 changes: 1 addition & 1 deletion lldb/source/Utility/ReproducerInstrumentation.cpp
Expand Up @@ -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;

0 comments on commit 5861234

Please sign in to comment.