فهرست منبع

Kernel: Store previous thread state upon all transitions to Stopped (#1753)

We now store the previous thread state in m_stop_state for all
transitions to the Stopped state via Thread::set_state.

Fixes #1752 whereupon resuming a thread that was stopped with SIGTSTP,
the previous state of the thread is not remembered correctly, resulting
in m_stop_state == State::Invalid and the associated assertion fails.
Peter Nelson 5 سال پیش
والد
کامیت
eff27f39d5
1فایلهای تغییر یافته به همراه4 افزوده شده و 2 حذف شده
  1. 4 2
      Kernel/Thread.cpp

+ 4 - 2
Kernel/Thread.cpp

@@ -499,7 +499,6 @@ ShouldUnblockThread Thread::dispatch_signal(u8 signal)
     if (signal == SIGSTOP) {
         if (!is_stopped()) {
             m_stop_signal = SIGSTOP;
-            m_stop_state = m_state;
             set_state(State::Stopped);
         }
         return ShouldUnblockThread::No;
@@ -526,7 +525,6 @@ ShouldUnblockThread Thread::dispatch_signal(u8 signal)
                 // make sure SemiPermanentBlocker is unblocked
                 if (m_blocker && m_blocker->is_reason_signal())
                     unblock();
-                m_stop_state = m_state;
                 set_state(Stopped);
                 return ShouldUnblockThread::No;
             }
@@ -757,6 +755,10 @@ void Thread::set_state(State new_state)
         ASSERT(m_blocker != nullptr);
     }
 
+    if (new_state == Stopped) {
+        m_stop_state = m_state;
+    }
+
     m_state = new_state;
     if (m_process.pid() != 0) {
         Scheduler::update_state_for_thread(*this);