aboutsummaryrefslogtreecommitdiff
path: root/core/time
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2024-08-14 15:10:31 +0100
committerGitHub <noreply@github.com>2024-08-14 15:10:31 +0100
commite810c3eacec9cae74a369c747bbc5bd2a386d20d (patch)
treef6ddfebe971d21ae6dc3ecf4c86c862c1c3ee96c /core/time
parent18b6af185881b7ad413157af5c21bf9d77712632 (diff)
parente29f0a0f40019d9a235e617759a24032a9688f85 (diff)
Merge pull request #4012 from laytan/posix
core:sys/posix and core:os/os2 based on it (for darwin, netbsd, freebsd and openbsd)
Diffstat (limited to 'core/time')
-rw-r--r--core/time/time_linux.odin38
-rw-r--r--core/time/time_unix.odin42
2 files changed, 67 insertions, 13 deletions
diff --git a/core/time/time_linux.odin b/core/time/time_linux.odin
new file mode 100644
index 000000000..649f601dc
--- /dev/null
+++ b/core/time/time_linux.odin
@@ -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()
+}
+
diff --git a/core/time/time_unix.odin b/core/time/time_unix.odin
index f3e0d6640..61543b99c 100644
--- a/core/time/time_unix.odin
+++ b/core/time/time_unix.odin
@@ -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()
}