[Lldb-commits] [PATCH] D145136: Add a Debugger interruption mechanism in parallel to the Command Interpreter interruption

Jim Ingham via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Tue Mar 7 13:02:50 PST 2023


jingham marked 5 inline comments as done.
jingham added inline comments.


================
Comment at: lldb/test/API/python_api/was_interrupted/TestDebuggerInterruption.py:39
+        def rendevous(self):
+            # We smuggle out lock and event to the runner thread using thread local data:
+            import interruptible
----------------
labath wrote:
> This had me confused for a while, because "thread local data" has a very specific meaning. Could you rename this to something else?
I did intend to use thread local data here - that's why LockContainer derives from threading.local.  

The problem is that I have to use the event & lock in the Python command I will run either directly or under RunCommandInterpreter, but I don't have way to explicitly pass python objects to a command when invoking it.  I could put the data in globals in the interruptible module.  However, since the test variants could be running in parallel this didn't seem like a great idea. So instead I pass the test to the CommandRunner that's going to create my test thread for me, and once it's created its thread, it puts the lock & event in the thread local data, and that's where WelcomeCommand picks it up from.  This is probably not 100% necessary, but seemed cleaner to me.


================
Comment at: lldb/test/API/python_api/was_interrupted/TestDebuggerInterruption.py:112
+        if not "check" in args:
+            self.lock = threading.Lock()
+            self.event = threading.Event()
----------------
labath wrote:
> I am confused as to what this lock's purpose is. I can see that it's taken on one thread and released on another (which is in itself an unusual thing to do, even though python permits it), but I still don't understand what does it achieve. Lock are generally used for protecting a certain object. If the goal is to control the interleaving of two threads, then maybe a sequence of barriers would be better. Something like:
> ```
> #thread 1
> work1()
> t1_done.wait()
> t2_done.wait()
> work3()
> t1_done.wait()
> # etc.. odd-numbered work happens on this thread
> 
> #thread 2
> t1_done.wait()
> work2()
> t2_done.wait()
> t1_done.wait()
> work4()
> # etc.. even-numbered work happens here
> ```
Here's a version using barriers exclusively.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D145136/new/

https://reviews.llvm.org/D145136



More information about the lldb-commits mailing list