1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- package time
- 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);
- }
|