From 49122cf729438b0ca9c5891c20f194629d915754 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 20 Aug 2025 18:35:18 +0300 Subject: [PATCH] Kernel: Allow adding signals to thread that are blocked --- kernel/include/kernel/Thread.h | 2 +- kernel/kernel/Process.cpp | 2 +- kernel/kernel/Thread.cpp | 21 +++++++++------------ 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/kernel/include/kernel/Thread.h b/kernel/include/kernel/Thread.h index 01207438..2e81e83e 100644 --- a/kernel/include/kernel/Thread.h +++ b/kernel/include/kernel/Thread.h @@ -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 diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 8e1273d1..8173c7ea 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -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) diff --git a/kernel/kernel/Thread.cpp b/kernel/kernel/Thread.cpp index 2c9d7e05..333b2bf3 100644 --- a/kernel/kernel/Thread.cpp +++ b/kernel/kernel/Thread.cpp @@ -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)) - { - m_signal_pending_mask |= mask; - if (this != &Thread::current()) - Processor::scheduler().unblock_thread(this); - return true; - } - return false; + + const uint64_t mask = 1ull << signal; + m_signal_pending_mask |= mask; + + if (this != &Thread::current()) + Processor::scheduler().unblock_thread(this); } BAN::ErrorOr Thread::sleep_or_eintr_ns(uint64_t ns)