aboutsummaryrefslogtreecommitdiff
path: root/core/time
diff options
context:
space:
mode:
Diffstat (limited to 'core/time')
-rw-r--r--core/time/time_darwin.odin55
1 files changed, 54 insertions, 1 deletions
diff --git a/core/time/time_darwin.odin b/core/time/time_darwin.odin
index 7d1a1441c..91acd8ae7 100644
--- a/core/time/time_darwin.odin
+++ b/core/time/time_darwin.odin
@@ -1,3 +1,56 @@
package time
-IS_SUPPORTED :: false; \ No newline at end of file
+foreign import libc "system:c"
+
+TimeSpec :: struct {
+ tv_sec : i64, /* seconds */
+ tv_nsec : i64, /* nanoseconds */
+};
+
+CLOCK_SYSTEM :: 0;
+CLOCK_CALENDAR :: 1;
+
+IS_SUPPORTED :: true;
+
+foreign libc {
+ @(link_name="clock_gettime") _clock_gettime :: proc(clock_id: u64, timespec: ^TimeSpec) ---;
+ @(link_name="nanosleep") _nanosleep :: proc(requested: ^TimeSpec, remaining: ^TimeSpec) -> int ---;
+ @(link_name="sleep") _sleep :: proc(seconds: u64) -> int ---;
+}
+
+clock_gettime :: proc(clock_id: u64) -> TimeSpec {
+ ts : TimeSpec;
+ _clock_gettime(clock_id, &ts);
+ return ts;
+}
+
+now :: proc() -> Time {
+
+ time_spec_now := clock_gettime(CLOCK_SYSTEM);
+ ns := time_spec_now.tv_sec * 1e9 + time_spec_now.tv_nsec;
+ return Time{_nsec=ns};
+}
+
+seconds_since_boot :: proc() -> f64 {
+
+ ts_boottime := clock_gettime(CLOCK_SYSTEM);
+ return f64(ts_boottime.tv_sec) + f64(ts_boottime.tv_nsec) / 1e9;
+}
+
+sleep :: proc(d: Duration) {
+
+ ds := duration_seconds(d);
+ seconds := u64(ds);
+ nanoseconds := i64((ds - f64(seconds)) * 1e9);
+
+ if seconds > 0 do _sleep(seconds);
+ if nanoseconds > 0 do nanosleep(nanoseconds);
+}
+
+nanosleep :: proc(nanoseconds: i64) -> int {
+ assert(nanoseconds <= 999999999);
+ requested, remaining : TimeSpec;
+ requested = TimeSpec{tv_nsec = nanoseconds};
+
+ return _nanosleep(&requested, &remaining);
+} \ No newline at end of file