kernel: Implement thread stopping and continuing
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
apio 2023-10-28 15:15:32 +02:00
parent 69771cbd85
commit e1d5b7e7b4
Signed by: apio
GPG Key ID: B8A7D06E42258954
2 changed files with 21 additions and 2 deletions

View File

@ -136,6 +136,7 @@ enum class DefaultSignalAction
{ {
Ignore, Ignore,
Terminate, Terminate,
Stop,
}; };
// FIXME: Implement coredumps for some signals. // FIXME: Implement coredumps for some signals.
@ -149,9 +150,9 @@ static constexpr DefaultSignalAction default_actions[] = {
DefaultSignalAction::Ignore, // SIGCHLD DefaultSignalAction::Ignore, // SIGCHLD
DefaultSignalAction::Terminate, // SIGFPE (dump core) DefaultSignalAction::Terminate, // SIGFPE (dump core)
DefaultSignalAction::Terminate, // SIGKILL DefaultSignalAction::Terminate, // SIGKILL
DefaultSignalAction::Terminate, // SIGSTOP (FIXME: Support stopping and continuing) DefaultSignalAction::Stop, // SIGSTOP
DefaultSignalAction::Terminate, // SIGSEGV (dump core) DefaultSignalAction::Terminate, // SIGSEGV (dump core)
DefaultSignalAction::Ignore, // SIGCONT (FIXME: Support stopping and continuing) DefaultSignalAction::Ignore, // SIGCONT (Handled separately)
DefaultSignalAction::Terminate, // SIGPIPE DefaultSignalAction::Terminate, // SIGPIPE
DefaultSignalAction::Terminate, // SIGALRM DefaultSignalAction::Terminate, // SIGALRM
DefaultSignalAction::Terminate, // SIGTERM DefaultSignalAction::Terminate, // SIGTERM
@ -193,6 +194,7 @@ void Thread::process_pending_signals(Registers* current_regs)
{ {
case DefaultSignalAction::Ignore: return; case DefaultSignalAction::Ignore: return;
case DefaultSignalAction::Terminate: exit_and_signal_parent(signo | _SIGBIT); case DefaultSignalAction::Terminate: exit_and_signal_parent(signo | _SIGBIT);
case DefaultSignalAction::Stop: stop();
default: return; default: return;
} }
} }
@ -227,12 +229,25 @@ void Thread::send_signal(int signo)
if (is_kernel) return; if (is_kernel) return;
if (state == ThreadState::Exited || state == ThreadState::Dying) return; if (state == ThreadState::Exited || state == ThreadState::Dying) return;
if (state == ThreadState::Stopped && signo == SIGCONT)
{
wake_up();
return;
}
check(signo > 0 && signo <= NSIG); check(signo > 0 && signo <= NSIG);
pending_signals.set(signo - 1, true); pending_signals.set(signo - 1, true);
if (state == ThreadState::Waiting || state == ThreadState::Sleeping || is_in_kernel(&regs)) if (state == ThreadState::Waiting || state == ThreadState::Sleeping || is_in_kernel(&regs))
{ {
if (state == ThreadState::Stopped && signo != SIGKILL) return;
interrupted = true; interrupted = true;
wake_up(); wake_up();
} }
} }
void Thread::stop()
{
state = ThreadState::Stopped;
kernel_yield();
}

View File

@ -26,6 +26,7 @@ enum class ThreadState
Runnable, Runnable,
Sleeping, Sleeping,
Waiting, Waiting,
Stopped,
Exited, Exited,
Dying Dying
}; };
@ -152,6 +153,9 @@ struct Thread : public LinkedListNode<Thread>
Result<u64> push_mem_on_stack(const u8* mem, usize size); Result<u64> push_mem_on_stack(const u8* mem, usize size);
Result<u64> pop_mem_from_stack(u8* mem, usize size); Result<u64> pop_mem_from_stack(u8* mem, usize size);
void stop();
void resume();
void send_signal(int signo); void send_signal(int signo);
static void init(); static void init();