ua_clock.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
  2. * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */
  3. #include "ua_types.h"
  4. #include <time.h>
  5. #if !defined(_WIN32) || defined(__MINGW32__)
  6. # include <sys/time.h>
  7. #endif
  8. #if defined(__APPLE__) || defined(__MACH__)
  9. # include <mach/clock.h>
  10. # include <mach/mach.h>
  11. #endif
  12. UA_DateTime UA_DateTime_now(void) {
  13. #if defined(_WIN32) && !defined(__MINGW32__)
  14. /* Windows filetime has the same definition as UA_DateTime */
  15. FILETIME ft;
  16. SYSTEMTIME st;
  17. GetSystemTime(&st);
  18. SystemTimeToFileTime(&st, &ft);
  19. ULARGE_INTEGER ul;
  20. ul.LowPart = ft.dwLowDateTime;
  21. ul.HighPart = ft.dwHighDateTime;
  22. return (UA_DateTime)ul.QuadPart;
  23. #else
  24. struct timeval tv;
  25. gettimeofday(&tv, NULL);
  26. return (tv.tv_sec * UA_SEC_TO_DATETIME) + (tv.tv_usec * UA_USEC_TO_DATETIME) + UA_DATETIME_UNIX_EPOCH;
  27. #endif
  28. }
  29. UA_DateTime UA_DateTime_nowMonotonic(void) {
  30. #if defined(_WIN32)
  31. LARGE_INTEGER freq, ticks;
  32. QueryPerformanceFrequency(&freq);
  33. QueryPerformanceCounter(&ticks);
  34. UA_Double ticks2dt = UA_SEC_TO_DATETIME;
  35. ticks2dt /= freq.QuadPart;
  36. return (UA_DateTime)(ticks.QuadPart * ticks2dt);
  37. #elif defined(__APPLE__) || defined(__MACH__)
  38. /* OS X does not have clock_gettime, use clock_get_time */
  39. clock_serv_t cclock;
  40. mach_timespec_t mts;
  41. host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &cclock);
  42. clock_get_time(cclock, &mts);
  43. mach_port_deallocate(mach_task_self(), cclock);
  44. return (mts.tv_sec * UA_SEC_TO_DATETIME) + (mts.tv_nsec / 100);
  45. #elif defined(__CYGWIN__) || !defined(CLOCK_MONOTONIC_RAW)
  46. struct timespec ts;
  47. clock_gettime(CLOCK_MONOTONIC, &ts);
  48. return (ts.tv_sec * UA_SEC_TO_DATETIME) + (ts.tv_nsec / 100);
  49. #else
  50. struct timespec ts;
  51. clock_gettime(CLOCK_MONOTONIC_RAW, &ts);
  52. return (ts.tv_sec * UA_SEC_TO_DATETIME) + (ts.tv_nsec / 100);
  53. #endif
  54. }