From 9c8b2ab0ff97da172166c68eab5fcf0f4a98e20d Mon Sep 17 00:00:00 2001
From: Axel Naumann <Axel.Naumann@cern.ch>
Date: Fri, 25 Aug 2017 11:58:47 -0700
Subject: [PATCH] Unlock upon entering user code, re-lock right after.

---
 core/metacling/src/TCling.cxx          | 16 ++++++++++++++++
 core/metacling/src/TClingCallbacks.cxx | 10 ++++++++++
 core/metacling/src/TClingCallbacks.h   |  3 +++
 3 files changed, 29 insertions(+)

diff --git a/core/metacling/src/TCling.cxx b/core/metacling/src/TCling.cxx
index d47627225c0..12ebb2c9454 100644
--- a/core/metacling/src/TCling.cxx
+++ b/core/metacling/src/TCling.cxx
@@ -350,6 +350,22 @@ void TCling__PrintStackTrace() {
    gSystem->StackTrace();
 }
 
+////////////////////////////////////////////////////////////////////////////////
+/// Lock the interpreter.
+
+extern "C"
+void TCling__LockInterpreterMutex() {
+   if (gInterpreterMutex) gInterpreterMutex->Lock();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Unlock the interpreter.
+
+extern "C"
+void TCling__UnlockInterpreterMutex() {
+   if (gInterpreterMutex) gInterpreterMutex->UnLock();
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 /// Update TClingClassInfo for a class (e.g. upon seeing a definition).
 
diff --git a/core/metacling/src/TClingCallbacks.cxx b/core/metacling/src/TClingCallbacks.cxx
index 6863a94a89a..03181876b8e 100644
--- a/core/metacling/src/TClingCallbacks.cxx
+++ b/core/metacling/src/TClingCallbacks.cxx
@@ -61,6 +61,8 @@ extern "C" {
    void TCling__LibraryUnloadedRTTI(const void* dyLibHandle,
                                     llvm::StringRef canonicalName);
    void TCling__PrintStackTrace();
+   void TCling__LockInterpreterMutex();
+   void TCling__UnlockInterpreterMutex();
 }
 
 TClingCallbacks::TClingCallbacks(cling::Interpreter* interp)
@@ -783,3 +785,11 @@ void TClingCallbacks::LibraryUnloaded(const void* dyLibHandle,
 void TClingCallbacks::PrintStackTrace() {
    TCling__PrintStackTrace();
 }
+
+void TClingCallbacks::EnteringUserCode() {
+  TCling__UnlockInterpreterMutex();
+}
+
+void TClingCallbacks::ReturnedFromUserCode() {
+  TCling__LockInterpreterMutex();
+}
diff --git a/core/metacling/src/TClingCallbacks.h b/core/metacling/src/TClingCallbacks.h
index 5915039c725..7522002cb7e 100644
--- a/core/metacling/src/TClingCallbacks.h
+++ b/core/metacling/src/TClingCallbacks.h
@@ -100,6 +100,9 @@ public:
 
    virtual void PrintStackTrace();
 
+   virtual void EnteringUserCode();
+   virtual void ReturnedFromUserCode();
+
 private:
    bool tryAutoParseInternal(llvm::StringRef Name, clang::LookupResult &R,
                             clang::Scope *S, const clang::FileEntry* FE = 0);
-- 
GitLab