nsresult TimeStamp::Startup() { // Decide which implementation to use for the high-performance timer. InitializeCriticalSectionAndSpinCount(&sTimeStampLock, kLockSpinCount); LARGE_INTEGER freq; BOOL QPCAvailable = ::QueryPerformanceFrequency(&freq); if (!QPCAvailable) { // No Performance Counter. Fall back to use GetTickCount. sFrequencyPerSec = 1; sFallBackToGTC = true; InitResolution(); LOG(("TimeStamp: using GetTickCount")); return NS_OK; } sFrequencyPerSec = freq.QuadPart; ULONGLONG qpc = PerformanceCounter(); sLastCalibrated = TickCount64(::GetTickCount()); sSkew = qpc - ms2mt(sLastCalibrated); InitThresholds(); InitResolution(); LOG(("TimeStamp: initial skew is %1.2fms", mt2ms_d(sSkew))); return NS_OK; }
MFBT_API void TimeStamp::Startup() { if (gInitialized) { return; } gInitialized = true; // Decide which implementation to use for the high-performance timer. HMODULE kernelDLL = GetModuleHandleW(L"kernel32.dll"); sGetTickCount64 = reinterpret_cast<GetTickCount64_t>( GetProcAddress(kernelDLL, "GetTickCount64")); if (!sGetTickCount64) { // If the platform does not support the GetTickCount64 (Windows XP doesn't), // then use our fallback implementation based on GetTickCount. sGetTickCount64 = MozGetTickCount64; } InitializeCriticalSectionAndSpinCount(&sTimeStampLock, kLockSpinCount); sHasStableTSC = HasStableTSC(); LOG(("TimeStamp: HasStableTSC=%d", sHasStableTSC)); LARGE_INTEGER freq; sUseQPC = ::QueryPerformanceFrequency(&freq); if (!sUseQPC) { // No Performance Counter. Fall back to use GetTickCount. InitResolution(); LOG(("TimeStamp: using GetTickCount")); return; } sFrequencyPerSec = freq.QuadPart; LOG(("TimeStamp: QPC frequency=%llu", sFrequencyPerSec)); InitThresholds(); InitResolution(); return; }
// Called when we detect a larger deviation of QPC to disable it. static inline void RecordFlaw() { sFallBackToGTC = true; LOG(("TimeStamp: falling back to GTC :(")); #if 0 // This code has been disabled, because we: // 0. InitResolution must not be called under the lock (would reenter) while // we shouldn't release it here just to allow it // 1. may return back to using QPC after system wake up // 2. InitResolution for GTC will probably return 0 anyway (increments // only every 15 or 16 ms.) // // There is no need to drop sFrequencyPerSec to 1, result of TickCount64 // is multiplied and later divided with sFrequencyPerSec. Changing it // here may introduce sync problems. Syncing access to sFrequencyPerSec // is overkill. Drawback is we loose some bits from the upper bound of // the 64 bits timer value, usualy up to 7, it means the app cannot run // more then some 4'000'000 years :) InitResolution(); #endif }
VideoMode::VideoMode(OptionWindow* win) : BaseObjectContainer(), win(win), resolution(NULL), resolutionLabel(NULL), windowed(NULL), vsync(NULL), ok(NULL), cancel(NULL) { InitResolution(); hardwareCursor = new GUICheckbox("Hardware Cursor", VideoSettings.Get<bool>("HardwareCursor")); windowed = new GUICheckbox("Windowed", !VideoSettings.Get<bool>("Fullscreen")); vsync = new GUICheckbox("VSync", VideoSettings.Get<bool>("Vsync")); ok = new GUIButton("Ok", "video:ok", this); cancel = new GUIButton("Cancel", "option:main", win); AddBaseObject(hardwareCursor); AddBaseObject(windowed); AddBaseObject(vsync); AddBaseObject(ok); AddBaseObject(cancel); }