Kaynağa Gözat

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.
Ben Wiederhake 5 yıl önce
ebeveyn
işleme
d8c8820ee9
2 değiştirilmiş dosya ile 2 ekleme ve 2 silme
  1. 1 1
      Kernel/Thread.cpp
  2. 1 1
      Kernel/Thread.h

+ 1 - 1
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;

+ 1 - 1
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 {