+ mtime_t res;
+
+#if defined (HAVE_CLOCK_NANOSLEEP)
+ struct timespec ts;
+
+ /* Try to use POSIX monotonic clock if available */
+ if( clock_gettime( CLOCK_MONOTONIC, &ts ) == EINVAL )
+ /* Run-time fallback to real-time clock (always available) */
+ (void)clock_gettime( CLOCK_REALTIME, &ts );
+
+ res = ((mtime_t)ts.tv_sec * (mtime_t)1000000)
+ + (mtime_t)(ts.tv_nsec / 1000);
+
+#elif defined( HAVE_KERNEL_OS_H )
+ res = real_time_clock_usecs();
+
+#elif defined( USE_APPLE_MACH )
+ pthread_once(&mtime_timebase_info_once, mtime_init_timebase);
+ uint64_t date = mach_absolute_time();
+ mach_timebase_info_data_t tb = mtime_timebase_info;
+
+ /* tb.denom is uint32_t, switch to 64 bits to prevent overflow. */
+ uint64_t denom = tb.denom;
+
+ /* Switch to microsecs */
+ denom *= 1000LL;
+
+ /* Split the division to prevent overflow */
+ lldiv_t d = lldiv (tb.numer, denom);
+
+ res = (d.quot * date) + ((d.rem * date) / denom);