posix: add package

This commit is contained in:
Laytan Laats
2024-08-14 01:44:35 +02:00
parent ac68a9d52c
commit efe68c2e24
83 changed files with 12665 additions and 328 deletions
+29 -13
View File
@@ -1,34 +1,50 @@
//+private
//+build linux, darwin, freebsd, openbsd, netbsd, haiku
//+build darwin, freebsd, openbsd, netbsd, haiku
package time
import "core:sys/unix"
import "core:sys/posix"
_IS_SUPPORTED :: true // NOTE: Times on Darwin are UTC.
_IS_SUPPORTED :: true
_now :: proc "contextless" () -> Time {
time_spec_now: unix.timespec
unix.clock_gettime(unix.CLOCK_REALTIME, &time_spec_now)
ns := time_spec_now.tv_sec * 1e9 + time_spec_now.tv_nsec
time_spec_now: posix.timespec
posix.clock_gettime(.REALTIME, &time_spec_now)
ns := i64(time_spec_now.tv_sec) * 1e9 + time_spec_now.tv_nsec
return Time{_nsec=ns}
}
_sleep :: proc "contextless" (d: Duration) {
ds := duration_seconds(d)
seconds := u32(ds)
seconds := posix.time_t(ds)
nanoseconds := i64((ds - f64(seconds)) * 1e9)
if seconds > 0 { unix.sleep(seconds) }
if nanoseconds > 0 { unix.inline_nanosleep(nanoseconds) }
ts := posix.timespec{
tv_sec = seconds,
tv_nsec = nanoseconds,
}
for {
res := posix.nanosleep(&ts, &ts)
if res == .OK || posix.errno() != .EINTR {
break
}
}
}
when ODIN_OS == .Darwin {
TICK_CLOCK :: posix.Clock(4) // CLOCK_MONOTONIC_RAW
} else {
// It looks like the BSDs don't have a CLOCK_MONOTONIC_RAW equivalent.
TICK_CLOCK :: posix.Clock.MONOTONIC
}
_tick_now :: proc "contextless" () -> Tick {
t: unix.timespec
unix.clock_gettime(unix.CLOCK_MONOTONIC_RAW, &t)
return Tick{_nsec = t.tv_sec*1e9 + t.tv_nsec}
t: posix.timespec
posix.clock_gettime(TICK_CLOCK, &t)
return Tick{_nsec = i64(t.tv_sec)*1e9 + t.tv_nsec}
}
_yield :: proc "contextless" () {
unix.sched_yield()
posix.sched_yield()
}