/src/rt/sync/timer.cpp

http://github.com/jruderman/rust · C++ · 75 lines · 63 code · 11 blank · 1 comment · 4 complexity · 55b444767dc1277e314699718efd1eb1 MD5 · raw file

  1. #include "../rust_globals.h"
  2. #include "timer.h"
  3. #if defined(__APPLE__)
  4. #include <mach/mach_time.h>
  5. #endif
  6. uint64_t ns_per_s = 1000000000LL;
  7. timer::timer() {
  8. #if __WIN32__
  9. _ticks_per_s = 0LL;
  10. // FIXME (#2675): assert this works or have a workaround.
  11. QueryPerformanceFrequency((LARGE_INTEGER *)&_ticks_per_s);
  12. if (_ticks_per_s == 0LL) {
  13. _ticks_per_s = 1LL;
  14. }
  15. #endif
  16. reset_us(0);
  17. }
  18. void
  19. timer::reset_us(uint64_t timeout_us) {
  20. _start_us = time_us();
  21. _timeout_us = timeout_us;
  22. }
  23. uint64_t
  24. timer::elapsed_us() {
  25. return time_us() - _start_us;
  26. }
  27. double
  28. timer::elapsed_ms() {
  29. return (double) elapsed_us() / 1000.0;
  30. }
  31. int64_t
  32. timer::remaining_us() {
  33. return _timeout_us - elapsed_us();
  34. }
  35. bool
  36. timer::has_timed_out() {
  37. return remaining_us() <= 0;
  38. }
  39. uint64_t
  40. timer::time_ns() {
  41. #ifdef __APPLE__
  42. uint64_t time = mach_absolute_time();
  43. mach_timebase_info_data_t info = {0, 0};
  44. if (info.denom == 0) {
  45. mach_timebase_info(&info);
  46. }
  47. uint64_t time_nano = time * (info.numer / info.denom);
  48. return time_nano;
  49. #elif __WIN32__
  50. uint64_t ticks;
  51. QueryPerformanceCounter((LARGE_INTEGER *)&ticks);
  52. return ((ticks * ns_per_s) / _ticks_per_s);
  53. #else
  54. timespec ts;
  55. clock_gettime(CLOCK_MONOTONIC, &ts);
  56. return (ts.tv_sec * ns_per_s + ts.tv_nsec);
  57. #endif
  58. }
  59. uint64_t
  60. timer::time_us() {
  61. return time_ns() / 1000;
  62. }
  63. timer::~timer() {
  64. }