From eff27f39d595a7e90b230d2580a5ef4956688a05 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 11 Apr 2020 22:39:46 +0100 Subject: [PATCH] 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. --- Kernel/Thread.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Kernel/Thread.cpp b/Kernel/Thread.cpp index 1e0e871309..53b6f49b63 100644 --- a/Kernel/Thread.cpp +++ b/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);