aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Heyes <rumcode@icloud.com>2019-07-16 22:27:58 +0100
committerChris Heyes <rumcode@icloud.com>2019-07-16 23:49:53 +0100
commitd85893954dccc7833e3d954db641d9fd2a3c7451 (patch)
tree1126c6da0ff2f299a7c47f0d1d39830deff11c07
parentd26033eb23c74ae4fc83dc6aaf2f2ec6571f2661 (diff)
Impl time for macOS
-rw-r--r--core/os/os_osx.odin32
-rw-r--r--core/time/time_osx.odin33
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));
+}