WaitBlocker: don't unblock if thread has pending SIGCONT

Previosuly, if we sent a SIGCONT to a stopped thread
and then waitpid() with WSTOPPED on that thread before
the signal was dispatched,
then the WaitBlocker would first unblock (because the thread is stopped)
and only after that the thread would get the SIGCONT signal.
This would mean that when waitpid returns
the waitee is not stopped.

To fix this, we do not unblock the waiting thread
if the waitee thread has a pending SIGCONT.
This commit is contained in:
Itamar 2020-03-28 11:03:43 +03:00 committed by Andreas Kling
parent 14047ca432
commit c9396be83f
Notes: sideshowbarker 2024-07-19 08:05:36 +09:00

View file

@ -261,7 +261,12 @@ bool Thread::WaitBlocker::should_unblock(Thread& thread, time_t, long)
return IterationDecision::Continue;
bool child_exited = child.is_dead();
bool child_stopped = child.thread_count() && child.any_thread().state() == Thread::State::Stopped;
bool child_stopped = false;
if (child.thread_count()) {
auto& child_thread = child.any_thread();
if (child_thread.state() == Thread::State::Stopped && !child_thread.has_pending_signal(SIGCONT))
child_stopped = true;
}
bool wait_finished = ((m_wait_options & WEXITED) && child_exited)
|| ((m_wait_options & WSTOPPED) && child_stopped);