Merge pull request #4012 from laytan/posix

core:sys/posix and core:os/os2 based on it (for darwin, netbsd, freebsd and openbsd)
This commit is contained in:
gingerBill
2024-08-14 15:10:31 +01:00
committed by GitHub
114 changed files with 14316 additions and 401 deletions
+38
View File
@@ -0,0 +1,38 @@
package time
import "core:sys/linux"
_IS_SUPPORTED :: true
_now :: proc "contextless" () -> Time {
time_spec_now, _ := linux.clock_gettime(.REALTIME)
ns := time_spec_now.time_sec * 1e9 + time_spec_now.time_nsec
return Time{_nsec=i64(ns)}
}
_sleep :: proc "contextless" (d: Duration) {
ds := duration_seconds(d)
seconds := uint(ds)
nanoseconds := uint((ds - f64(seconds)) * 1e9)
ts := linux.Time_Spec{
time_sec = seconds,
time_nsec = nanoseconds,
}
for {
if linux.nanosleep(&ts, &ts) != .EINTR {
break
}
}
}
_tick_now :: proc "contextless" () -> Tick {
t, _ := linux.clock_gettime(.MONOTONIC_RAW)
return Tick{_nsec = i64(t.time_sec*1e9 + t.time_nsec)}
}
_yield :: proc "contextless" () {
linux.sched_yield()
}
+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()
}