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.
This commit is contained in:
Peter Nelson 2020-04-11 22:39:46 +01:00 committed by GitHub
parent 8aab8faf30
commit eff27f39d5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
Notes: sideshowbarker 2024-07-19 07:41:42 +09:00

View file

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