diff options
| author | Chris Heyes <rumcode@icloud.com> | 2019-07-16 22:27:58 +0100 |
|---|---|---|
| committer | Chris Heyes <rumcode@icloud.com> | 2019-07-16 23:49:53 +0100 |
| commit | d85893954dccc7833e3d954db641d9fd2a3c7451 (patch) | |
| tree | 1126c6da0ff2f299a7c47f0d1d39830deff11c07 | |
| parent | d26033eb23c74ae4fc83dc6aaf2f2ec6571f2661 (diff) | |
Impl time for macOS
| -rw-r--r-- | core/os/os_osx.odin | 32 | ||||
| -rw-r--r-- | core/time/time_osx.odin | 33 |
2 files changed, 64 insertions, 1 deletions
diff --git a/core/os/os_osx.odin b/core/os/os_osx.odin index 302cba76a..e0950dee1 100644 --- a/core/os/os_osx.odin +++ b/core/os/os_osx.odin @@ -126,6 +126,14 @@ W_OK :: 2; // Test for write permission X_OK :: 1; // Test for execute permission F_OK :: 0; // Test for file existance +TimeSpec :: struct { + tv_sec : i64, /* seconds */ + tv_nsec : i64, /* nanoseconds */ +}; + +CLOCK_SYSTEM :: 0; +CLOCK_CALENDAR :: 1; + foreign libc { @(link_name="open") _unix_open :: proc(path: cstring, flags: int, #c_vararg mode: ..any) -> Handle ---; @(link_name="close") _unix_close :: proc(handle: Handle) ---; @@ -142,6 +150,10 @@ foreign libc { @(link_name="realloc") _unix_realloc :: proc(ptr: rawptr, size: int) -> rawptr ---; @(link_name="getenv") _unix_getenv :: proc(cstring) -> cstring ---; + @(link_name="clock_gettime") _unix_clock_gettime :: proc(clock_id: u64, timespec: ^TimeSpec) ---; + @(link_name="nanosleep") _unix_nanosleep :: proc(requested: ^TimeSpec, remaining: ^TimeSpec) -> int ---; + @(link_name="sleep") _unix_sleep :: proc(seconds: u64) -> int ---; + @(link_name="exit") _unix_exit :: proc(status: int) ---; } @@ -259,6 +271,26 @@ exit :: inline proc(code: int) -> ! { } +clock_gettime :: proc(clock_id: u64) -> TimeSpec { + ts : TimeSpec; + _unix_clock_gettime(clock_id, &ts); + return ts; +} + +sleep :: proc(seconds: u64) -> int { + + return _unix_sleep(seconds); +} + +nanosleep :: proc(nanoseconds: i64) -> int { + assert(nanoseconds <= 999999999); + requested, remaining : TimeSpec; + requested = TimeSpec{tv_nsec = nanoseconds}; + + return _unix_nanosleep(&requested, &remaining); +} + + current_thread_id :: proc "contextless" () -> int { // return int(_unix_gettid()); return 0; diff --git a/core/time/time_osx.odin b/core/time/time_osx.odin index 7d1a1441c..fd499d1ce 100644 --- a/core/time/time_osx.odin +++ b/core/time/time_osx.odin @@ -1,3 +1,34 @@ package time -IS_SUPPORTED :: false;
\ No newline at end of file +import "core:os"; + +IS_SUPPORTED :: true; + +now :: proc() -> Time { + + time_spec_now := os.clock_gettime(os.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 := os.clock_gettime(os.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 os.sleep(seconds); + if nanoseconds > 0 do os.nanosleep(nanoseconds); +} + +nanosleep :: proc(d: Duration) { + // NOTE(Jeroen): os.nanosleep returns -1 on failure, 0 on success + // duration needs to be [0, 999999999] nanoseconds. + os.nanosleep(i64(d)); +} |