uint32 Time::getApproximateMillisecondCounter() noexcept { if (TimeHelpers::lastMSCounterValue == 0) getMillisecondCounter(); return TimeHelpers::lastMSCounterValue; }
void Time::waitForMillisecondCounter (const uint32 targetTime) noexcept { for (;;) { const uint32 now = getMillisecondCounter(); if (now >= targetTime) break; const int toWait = (int) (targetTime - now); if (toWait > 2) { Thread::sleep (jmin (20, toWait >> 1)); } else { // xxx should consider using mutex_pause on the mac as it apparently // makes it seem less like a spinlock and avoids lowering the thread pri. for (int i = 10; --i >= 0;)
//============================================================================== int64 Time::currentTimeMillis() noexcept { static uint32 lastCounterResult = 0xffffffff; static int64 correction = 0; const uint32 now = getMillisecondCounter(); // check the counter hasn't wrapped (also triggered the first time this function is called) if (now < lastCounterResult) { // double-check it's actually wrapped, in case multi-cpu machines have timers that drift a bit. if (lastCounterResult == 0xffffffff || now < lastCounterResult - 10) { // get the time once using normal library calls, and store the difference needed to // turn the millisecond counter into a real time. #if JUCE_WINDOWS struct _timeb t; #ifdef USE_NEW_SECURE_TIME_FNS _ftime_s (&t); #else _ftime (&t); #endif correction = (((int64) t.time) * 1000 + t.millitm) - now; #else struct timeval tv; struct timezone tz; gettimeofday (&tv, &tz); correction = (((int64) tv.tv_sec) * 1000 + tv.tv_usec / 1000) - now; #endif } } lastCounterResult = now; return correction + now; }