diff --git a/kernel/include/kernel/Thread.h b/kernel/include/kernel/Thread.h index 1692579d..7d1e78a6 100644 --- a/kernel/include/kernel/Thread.h +++ b/kernel/include/kernel/Thread.h @@ -48,7 +48,7 @@ namespace Kernel bool add_signal(int signal); // blocks semaphore and returns either on unblock, eintr or spuriously - [[nodiscard]] bool block_or_eintr(Semaphore&); + BAN::ErrorOr 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; } diff --git a/kernel/kernel/Terminal/TTY.cpp b/kernel/kernel/Terminal/TTY.cpp index 297c756c..f376028c 100644 --- a/kernel/kernel/Terminal/TTY.cpp +++ b/kernel/kernel/Terminal/TTY.cpp @@ -322,11 +322,11 @@ namespace Kernel uint32_t depth = m_lock.lock_depth(); for (uint32_t i = 0; i < depth; i++) m_lock.unlock(); - bool eintr = Thread::current().block_or_eintr(m_output.semaphore); + auto eintr = Thread::current().block_or_eintr(m_output.semaphore); for (uint32_t i = 0; i < depth; i++) m_lock.lock(); - if (eintr) - return BAN::Error::from_errno(EINTR); + if (eintr.is_error()) + return eintr.release_error(); } if (m_output.bytes == 0) diff --git a/kernel/kernel/Thread.cpp b/kernel/kernel/Thread.cpp index 58cabb31..6474f630 100644 --- a/kernel/kernel/Thread.cpp +++ b/kernel/kernel/Thread.cpp @@ -343,12 +343,14 @@ namespace Kernel return false; } - bool Thread::block_or_eintr(Semaphore& semaphore) + BAN::ErrorOr Thread::block_or_eintr(Semaphore& semaphore) { if (is_interrupted_by_signal()) - return true; + return BAN::Error::from_errno(EINTR); semaphore.block(); - return is_interrupted_by_signal(); + if (is_interrupted_by_signal()) + return BAN::Error::from_errno(EINTR); + return {}; } void Thread::validate_stack() const