Kernel: Allow adding signals to thread that are blocked

This commit is contained in:
Bananymous 2025-08-20 18:35:18 +03:00
parent 84f579be81
commit 49122cf729
3 changed files with 11 additions and 14 deletions

View File

@ -59,7 +59,7 @@ namespace Kernel
bool will_execute_signal() const;
// Returns true if handled signal had SA_RESTART
bool handle_signal(int signal = 0);
bool add_signal(int signal);
void add_signal(int signal);
// blocks current thread and returns either on unblock, eintr, spuriously or after timeout
// if mutex is not nullptr, it will be atomically freed before blocking and automatically locked on wake

View File

@ -309,7 +309,7 @@ namespace Kernel
LockGuard _(m_process_lock);
for (auto* thread : m_threads)
if (thread != &Thread::current())
ASSERT(thread->add_signal(SIGKILL));
thread->add_signal(SIGKILL);
}
while (m_threads.size() > 1)

View File

@ -619,7 +619,7 @@ namespace Kernel
return has_sa_restart;
}
bool Thread::add_signal(int signal)
void Thread::add_signal(int signal)
{
SpinLockGuard _(m_signal_lock);
if (m_process)
@ -631,19 +631,16 @@ namespace Kernel
signal_handler = (vaddr_t)m_process->m_signal_handlers[signal].sa_handler;
}
if (signal_handler == (vaddr_t)SIG_IGN)
return false;
return;
if (signal_handler == (vaddr_t)SIG_DFL && is_default_ignored_signal(signal))
return false;
return;
}
uint64_t mask = 1ull << signal;
if (!(m_signal_block_mask & mask))
{
const uint64_t mask = 1ull << signal;
m_signal_pending_mask |= mask;
if (this != &Thread::current())
Processor::scheduler().unblock_thread(this);
return true;
}
return false;
}
BAN::ErrorOr<void> Thread::sleep_or_eintr_ns(uint64_t ns)