瀏覽代碼

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 年之前
父節點
當前提交
c9396be83f
共有 1 個文件被更改,包括 6 次插入1 次删除
  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);