time_windows.odin 975 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. //+private
  2. package time
  3. import win32 "core:sys/windows"
  4. _IS_SUPPORTED :: true
  5. _now :: proc "contextless" () -> Time {
  6. file_time: win32.FILETIME
  7. ns: i64
  8. // monotonic
  9. win32.GetSystemTimePreciseAsFileTime(&file_time)
  10. dt := u64(transmute(u64le)file_time) // in 100ns units
  11. ns = i64((dt - 116444736000000000) * 100) // convert to ns
  12. return unix(0, ns)
  13. }
  14. _sleep :: proc "contextless" (d: Duration) {
  15. win32.Sleep(win32.DWORD(d/Millisecond))
  16. }
  17. _tick_now :: proc "contextless" () -> Tick {
  18. mul_div_u64 :: proc "contextless" (val, num, den: i64) -> i64 {
  19. q := val / den
  20. r := val % den
  21. return q * num + r * num / den
  22. }
  23. @thread_local qpc_frequency: win32.LARGE_INTEGER
  24. if qpc_frequency == 0 {
  25. win32.QueryPerformanceFrequency(&qpc_frequency)
  26. }
  27. now: win32.LARGE_INTEGER
  28. win32.QueryPerformanceCounter(&now)
  29. _nsec := mul_div_u64(i64(now), 1e9, i64(qpc_frequency))
  30. return Tick{_nsec = _nsec}
  31. }
  32. _yield :: proc "contextless" () {
  33. win32.SwitchToThread()
  34. }