Kernel: Allow adding signals to thread that are blocked
This commit is contained in:
parent
84f579be81
commit
49122cf729
|
@ -59,7 +59,7 @@ namespace Kernel
|
||||||
bool will_execute_signal() const;
|
bool will_execute_signal() const;
|
||||||
// Returns true if handled signal had SA_RESTART
|
// Returns true if handled signal had SA_RESTART
|
||||||
bool handle_signal(int signal = 0);
|
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
|
// 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
|
// if mutex is not nullptr, it will be atomically freed before blocking and automatically locked on wake
|
||||||
|
|
|
@ -309,7 +309,7 @@ namespace Kernel
|
||||||
LockGuard _(m_process_lock);
|
LockGuard _(m_process_lock);
|
||||||
for (auto* thread : m_threads)
|
for (auto* thread : m_threads)
|
||||||
if (thread != &Thread::current())
|
if (thread != &Thread::current())
|
||||||
ASSERT(thread->add_signal(SIGKILL));
|
thread->add_signal(SIGKILL);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (m_threads.size() > 1)
|
while (m_threads.size() > 1)
|
||||||
|
|
|
@ -619,7 +619,7 @@ namespace Kernel
|
||||||
return has_sa_restart;
|
return has_sa_restart;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Thread::add_signal(int signal)
|
void Thread::add_signal(int signal)
|
||||||
{
|
{
|
||||||
SpinLockGuard _(m_signal_lock);
|
SpinLockGuard _(m_signal_lock);
|
||||||
if (m_process)
|
if (m_process)
|
||||||
|
@ -631,19 +631,16 @@ namespace Kernel
|
||||||
signal_handler = (vaddr_t)m_process->m_signal_handlers[signal].sa_handler;
|
signal_handler = (vaddr_t)m_process->m_signal_handlers[signal].sa_handler;
|
||||||
}
|
}
|
||||||
if (signal_handler == (vaddr_t)SIG_IGN)
|
if (signal_handler == (vaddr_t)SIG_IGN)
|
||||||
return false;
|
return;
|
||||||
if (signal_handler == (vaddr_t)SIG_DFL && is_default_ignored_signal(signal))
|
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;
|
m_signal_pending_mask |= mask;
|
||||||
|
|
||||||
if (this != &Thread::current())
|
if (this != &Thread::current())
|
||||||
Processor::scheduler().unblock_thread(this);
|
Processor::scheduler().unblock_thread(this);
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<void> Thread::sleep_or_eintr_ns(uint64_t ns)
|
BAN::ErrorOr<void> Thread::sleep_or_eintr_ns(uint64_t ns)
|
||||||
|
|
Loading…
Reference in New Issue