Kernel: Scheduler now sends queued signals

This commit is contained in:
Bananymous 2023-07-21 19:27:10 +03:00
parent a989c44211
commit b56316e9da
4 changed files with 18 additions and 4 deletions

View File

@ -37,6 +37,7 @@ namespace Kernel
BAN::ErrorOr<Thread*> clone(Process*, uintptr_t rsp, uintptr_t rip); BAN::ErrorOr<Thread*> clone(Process*, uintptr_t rsp, uintptr_t rip);
void setup_exec(); void setup_exec();
void handle_next_signal();
void handle_signal(int signal, uintptr_t& return_rsp, uintptr_t& return_rip); void handle_signal(int signal, uintptr_t& return_rsp, uintptr_t& return_rip);
pid_t tid() const { return m_tid; } pid_t tid() const { return m_tid; }

View File

@ -794,6 +794,8 @@ namespace Kernel
if (signal < _SIGMIN || signal > _SIGMAX) if (signal < _SIGMIN || signal > _SIGMAX)
return BAN::Error::from_errno(EINVAL); return BAN::Error::from_errno(EINVAL);
ASSERT(m_threads.size() == 1); ASSERT(m_threads.size() == 1);
CriticalScope _;
Thread::current().m_signal_queue.push(signal);
Thread::current().handle_signal(signal, return_rsp, return_rip); Thread::current().handle_signal(signal, return_rsp, return_rip);
return 0; return 0;
} }

View File

@ -212,6 +212,8 @@ namespace Kernel
current.set_started(); current.set_started();
start_thread(current.rsp(), current.rip()); start_thread(current.rsp(), current.rip());
case Thread::State::Executing: case Thread::State::Executing:
while (!current.m_signal_queue.empty())
current.handle_next_signal();
continue_thread(current.rsp(), current.rip()); continue_thread(current.rsp(), current.rip());
case Thread::State::Terminating: case Thread::State::Terminating:
ENABLE_INTERRUPTS(); ENABLE_INTERRUPTS();

View File

@ -143,10 +143,20 @@ namespace Kernel
} }
} }
void Thread::handle_next_signal()
{
ASSERT(!interrupts_enabled());
ASSERT(!m_signal_queue.empty());
handle_signal(m_signal_queue.front(), m_rsp, m_rip);
}
void Thread::handle_signal(int signal, uintptr_t& return_rsp, uintptr_t& return_rip) void Thread::handle_signal(int signal, uintptr_t& return_rsp, uintptr_t& return_rip)
{ {
ASSERT(!interrupts_enabled());
ASSERT(signal >= _SIGMIN && signal <= _SIGMAX); ASSERT(signal >= _SIGMIN && signal <= _SIGMAX);
ASSERT(&Thread::current() == this); ASSERT(&Thread::current() == this);
ASSERT(!m_signal_queue.empty());
ASSERT(m_signal_queue.front() == signal);
// Skip masked (ignored) signals // Skip masked (ignored) signals
if (m_signal_mask & (1ull << signal)) if (m_signal_mask & (1ull << signal))
@ -154,7 +164,6 @@ namespace Kernel
if (m_signal_handlers[signal]) if (m_signal_handlers[signal])
{ {
asm volatile("cli");
write_to_stack(return_rsp, return_rip); write_to_stack(return_rsp, return_rip);
write_to_stack(return_rsp, signal); write_to_stack(return_rsp, signal);
write_to_stack(return_rsp, m_signal_handlers[signal]); write_to_stack(return_rsp, m_signal_handlers[signal]);
@ -193,6 +202,8 @@ namespace Kernel
{ {
auto message = BAN::String::formatted("killed by signal {}\n", signal); auto message = BAN::String::formatted("killed by signal {}\n", signal);
(void)process().tty().write(0, message.data(), message.size()); (void)process().tty().write(0, message.data(), message.size());
ENABLE_INTERRUPTS();
process().exit(128 + signal); process().exit(128 + signal);
ASSERT_NOT_REACHED(); ASSERT_NOT_REACHED();
} }
@ -214,8 +225,6 @@ namespace Kernel
} }
} }
asm volatile("cli");
if (!m_signal_queue.empty() && m_signal_queue.front() == signal)
m_signal_queue.pop(); m_signal_queue.pop();
} }