Updating time duration functions.

This commit is contained in:
Christoffer Lerno
2023-09-05 10:57:50 +02:00
parent 53598b8c40
commit ffb7935e12
10 changed files with 80 additions and 60 deletions

View File

@@ -191,22 +191,9 @@ struct PosixThreadData @private
void* arg;
}
fn void! native_sleep_nano(ulong nano)
fn void! native_sleep_nano(NanoDuration nano)
{
TimeSpec to = { .s = 0, .ns = (CLong)nano };
if (libc::nanosleep(&to, null)) return ThreadFault.INTERRUPTED?;
}
fn void! native_sleep_ms(ulong ms)
{
TimeSpec to = { .s = (Time_t)(ms / 1000), .ns = (CLong)((ms % 1000) * 1000_000) };
if (libc::nanosleep(&to, null)) return ThreadFault.INTERRUPTED?;
}
fn void! native_sleep(double s)
{
Time_t si = (Time_t)s;
TimeSpec to = { .s = si, .ns = (CLong)((s - si) * 1000_000_000) };
if (libc::nanosleep(&to, null)) return ThreadFault.INTERRUPTED?;
if (nano <= 0) return;
if (libc::nanosleep(&&nano.to_timespec(), null)) return ThreadFault.INTERRUPTED?;
}

View File

@@ -317,20 +317,10 @@ fn bool NativeThread.equals(thread, NativeThread other)
return win32::getThreadId(thread) == win32::getThreadId(other);
}
/**
* @require ms < uint.max "Too long sleep"
**/
fn void! native_sleep_ms(ulong ms)
fn void! native_sleep_nano(NanoDuration ns)
{
if (win32::sleepEx((uint)ms, true) == win32::WAIT_IO_COMPLETION) return ThreadFault.INTERRUPTED?;
}
fn void! native_sleep(double s)
{
return native_sleep_ms((uint)s * 1000);
}
fn void! native_sleep_nano(ulong ns)
{
return native_sleep_ms(ns < 1000_000 ? 1 : ns / 1000_000);
long ms = ns.to_ms();
if (ms <= 0) return;
if (ms > Win32_DWORD.max) ms = Win32_DWORD.max;
if (win32::sleepEx((Win32_DWORD)ms, (Win32_BOOL)true) == win32::WAIT_IO_COMPLETION) return ThreadFault.INTERRUPTED?;
}

View File

@@ -68,6 +68,6 @@ macro void OnceFlag.call(&flag, OnceFn func) => NativeOnceFlag.call_once((Native
macro void yield() => os::native_thread_yield();
macro Thread current() => os::native_thread_current();
macro void exit(int result) => os::native_thread_exit(result);
macro void! sleep(double s) @maydiscard => os::native_sleep(s);
macro void! sleep_ms(ulong ms) @maydiscard => os::native_sleep_ms(ms);
macro void! sleep_ns(ulong ns) @maydiscard => os::native_sleep_nano(ns);
macro void! sleep(Duration d) @maydiscard => os::native_sleep_nano(d.to_nano());
macro void! sleep_ms(ulong ms) @maydiscard => sleep(time::ms(ms));
macro void! sleep_ns(NanoDuration ns) @maydiscard => os::native_sleep_nano(ns);