|
@@ -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);
|
|
|
+}
|