mirror of
https://github.com/Ed94/Odin.git
synced 2026-07-31 03:40:08 +00:00
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:
@@ -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
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user