[Lldb-commits] [lldb] [lldb] Fix race condition in Process::WaitForProcessToStop() (PR #144919)

via lldb-commits lldb-commits at lists.llvm.org
Wed Jul 30 09:54:08 PDT 2025


athierry-oct wrote:

Hi, sorry for the delay. I investigated the `TestCallThatRestarts.py` failure, and I think I’ve figured out what’s going on.

Toward the end of the test, we run:

```python
value = frame.EvaluateExpression("call_me (%d)" % (num_sigchld), options)
```

Then we call:

```python
error = process.Continue()
```

This triggers `Process::ResumeSynchronous()`, which:
- Hijacks the process events
- Calls `PrivateResume()`
- Waits for a stop event via `WaitForProcessToStop()`

The issue is that a public stop event is sent at the end of `EvaluateExpression()`, and that event is still sitting in the primary listener’s queue when `Process::ResumeSynchronous()` hijacks the events. With my changes, that old stop event gets moved to the hijacker’s queue. So `ResumeSynchronous()` ends up grabbing it (even though it happened *before* the resume) and returns too early.

It looks like moving pending events during hijacking might not always be the right thing to do. In the case of `ResumeSynchronous()`, I think we want to make sure the stop event we wait for happens *after* hijacking and resuming.

One idea: we could add a `bool move_pending_events` flag to `HijackProcessEvents()` and `RestoreProcessEvents()`. It would default to `false`, and we could set it to `true` in `StopForDestroyOrDetach()`. This way, only the behavior of `StopForDestroyOrDetach()` is modified for now.

I gave this a quick try, and now the `check-lldb-api` suite passes on my machine.

Does that approach sound reasonable to you?

https://github.com/llvm/llvm-project/pull/144919


More information about the lldb-commits mailing list