diff --git a/kernel/include/kernel/Thread.h b/kernel/include/kernel/Thread.h index 30b3527b..7ae32ec1 100644 --- a/kernel/include/kernel/Thread.h +++ b/kernel/include/kernel/Thread.h @@ -47,6 +47,9 @@ namespace Kernel void handle_signal(int signal = 0); bool add_signal(int signal); + // blocks semaphore and returns either on unblock, eintr or spuriously + [[nodiscard]] bool block_or_eintr(Semaphore&); + void set_return_rsp(uintptr_t& rsp) { m_return_rsp = &rsp; } void set_return_rip(uintptr_t& rip) { m_return_rip = &rip; } uintptr_t return_rsp() { ASSERT(m_return_rsp); return *m_return_rsp; } diff --git a/kernel/kernel/Thread.cpp b/kernel/kernel/Thread.cpp index 8ff96709..01acffcf 100644 --- a/kernel/kernel/Thread.cpp +++ b/kernel/kernel/Thread.cpp @@ -330,6 +330,14 @@ namespace Kernel return false; } + bool Thread::block_or_eintr(Semaphore& semaphore) + { + if (is_interrupted_by_signal()) + return true; + semaphore.block(); + return is_interrupted_by_signal(); + } + void Thread::validate_stack() const { if (stack_base() <= m_rsp && m_rsp <= stack_base() + stack_size())