Browse Source

Merge pull request #404 from hazeycode/master

Impl time for macOS
gingerBill 5 years ago
parent
commit
b5b085914a
2 changed files with 54 additions and 2 deletions
  1. 0 1
      core/os/os_darwin.odin
  2. 54 1
      core/time/time_darwin.odin

+ 0 - 1
core/os/os_darwin.odin

@@ -258,7 +258,6 @@ exit :: inline proc(code: int) -> ! {
 	_unix_exit(code);
 }
 
-
 current_thread_id :: proc "contextless" () -> int {
 	// return int(_unix_gettid());
 	return 0;

+ 54 - 1
core/time/time_darwin.odin

@@ -1,3 +1,56 @@
 package time
 
-IS_SUPPORTED :: false;
+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);
+}