From d8c8820ee922c2ee89d11963c96f312c5fe6be87 Mon Sep 17 00:00:00 2001 From: Ben Wiederhake Date: Mon, 11 May 2020 14:50:21 +0200 Subject: [PATCH] Kernel: Allow Thread::sleep for more than 388 days Because Thread::sleep is an internal interface, it's easy to check that there are only few callers: Process::sys$sleep, usleep, and nanosleep are happy with this increased size, because now they support the entire range of their arguments (assuming small-ish values for ticks_per_second()). SyncTask doesn't care. Note that the old behavior wasn't "cap out at 388 days", which would have been reasonable. Instead, the code resulted in unsigned overflow, meaning that a very long sleep would "on average" end after about 194 days, sometimes much quicker. --- Kernel/Thread.cpp | 2 +- Kernel/Thread.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Kernel/Thread.cpp b/Kernel/Thread.cpp index 01842b06b4..f9044109f4 100644 --- a/Kernel/Thread.cpp +++ b/Kernel/Thread.cpp @@ -220,7 +220,7 @@ void Thread::relock_process(bool did_unlock) process().big_lock().lock(); } -u64 Thread::sleep(u32 ticks) +u64 Thread::sleep(u64 ticks) { ASSERT(state() == Thread::Running); u64 wakeup_time = g_uptime + ticks; diff --git a/Kernel/Thread.h b/Kernel/Thread.h index 50ffe54a1a..138867d694 100644 --- a/Kernel/Thread.h +++ b/Kernel/Thread.h @@ -297,7 +297,7 @@ public: VirtualAddress thread_specific_data() const { return m_thread_specific_data; } size_t thread_specific_region_size() const { return m_thread_specific_region_size; } - u64 sleep(u32 ticks); + u64 sleep(u64 ticks); u64 sleep_until(u64 wakeup_time); class BlockResult {