diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 3297e4df..42215a6c 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -598,14 +598,16 @@ namespace Kernel BAN::ErrorOr Process::sys_sleep(int seconds) { - // FIXME: this is very dumb + if (seconds == 0) + return 0; + uint64_t wake_time = SystemTimer::get().ms_since_boot() + seconds * 1000; - while (SystemTimer::get().ms_since_boot() < wake_time) - { - if (Thread::current().is_interrupted_by_signal()) - return BAN::Math::div_round_up(wake_time - SystemTimer::get().ms_since_boot(), 1000); - Scheduler::get().reschedule(); - } + Scheduler::get().set_current_thread_sleeping(wake_time); + + uint64_t current_time = SystemTimer::get().ms_since_boot(); + if (current_time < wake_time) + return BAN::Math::div_round_up(wake_time - current_time, 1000); + return 0; } diff --git a/kernel/kernel/Terminal/TTY.cpp b/kernel/kernel/Terminal/TTY.cpp index d02ef985..bcfd14c7 100644 --- a/kernel/kernel/Terminal/TTY.cpp +++ b/kernel/kernel/Terminal/TTY.cpp @@ -303,14 +303,12 @@ namespace Kernel LockGuard _(m_lock); while (!m_output.flush) { - if (Thread::current().is_interrupted_by_signal()) - return BAN::Error::from_errno(EINTR); m_lock.unlock(); - m_output.semaphore.block(); + bool eintr = Thread::current().block_or_eintr(m_output.semaphore); m_lock.lock(); + if (eintr) + return BAN::Error::from_errno(EINTR); } - if (Thread::current().is_interrupted_by_signal()) - return BAN::Error::from_errno(EINTR); if (m_output.bytes == 0) {