time_linux.odin 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package time
  2. import "core:os";
  3. // NOTE(Jeroen): The times returned are in UTC
  4. IS_SUPPORTED :: true;
  5. now :: proc() -> Time {
  6. time_spec_now := os.clock_gettime(os.CLOCK_REALTIME);
  7. ns := time_spec_now.tv_sec * 1e9 + time_spec_now.tv_nsec;
  8. return Time{_nsec=ns};
  9. }
  10. boot_time :: proc() -> Time {
  11. ts_now := os.clock_gettime(os.CLOCK_REALTIME);
  12. ts_boottime := os.clock_gettime(os.CLOCK_BOOTTIME);
  13. ns := (ts_now.tv_sec - ts_boottime.tv_sec) * 1e9 + ts_now.tv_nsec - ts_boottime.tv_nsec;
  14. return Time{_nsec=ns};
  15. }
  16. seconds_since_boot :: proc() -> f64 {
  17. ts_boottime := os.clock_gettime(os.CLOCK_BOOTTIME);
  18. return f64(ts_boottime.tv_sec) + f64(ts_boottime.tv_nsec) / 1e9;
  19. }
  20. sleep :: proc(d: Duration) {
  21. ds := duration_seconds(d);
  22. seconds := u64(ds);
  23. nanoseconds := i64((ds - f64(seconds)) * 1e9);
  24. if seconds > 0 do os.sleep(seconds);
  25. if nanoseconds > 0 do os.nanosleep(nanoseconds);
  26. }
  27. nanosleep :: proc(d: Duration) {
  28. // NOTE(Jeroen): os.nanosleep returns -1 on failure, 0 on success
  29. // duration needs to be [0, 999999999] nanoseconds.
  30. os.nanosleep(i64(d));
  31. }