Browse Source

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.
Itamar 5 years ago
parent
commit
c9396be83f
1 changed files with 6 additions and 1 deletions
  1. 6 1
      Kernel/Scheduler.cpp

+ 6 - 1
Kernel/Scheduler.cpp

@@ -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);