Kristján Valur Jónsson skrev: > Thanks, I'll take a look in that direction. > > I have a suggestion, forgive me if I am totally ignorant. :-) Sturla Molden #include <windows.h> union __reftime { double us; __int64 bits; }; static volatile union __reftime __ref_perftime, __ref_filetime; double clock() { __int64 cnt, hz, init; double us; union __reftime ref_filetime; union __reftime ref_perftime; for (;;) { ref_filetime.bits = __ref_filetime.bits; ref_perftime.bits = __ref_perftime.bits; if(!QueryPerformanceCounter((LARGE_INTEGER*)&cnt)) goto error; if(!QueryPerformanceFrequency((LARGE_INTEGER*)&hz)) goto error; us = ref_filetime.us + ((double)(1000000*cnt)/(double)hz - ref_perftime.us); /* verify that values did not change */ init = InterlockedCompareExchange64((LONGLONG*)&__ref_filetime.bits, (LONGLONG)ref_filetime.bits, (LONGLONG)ref_filetime.bits); if (init != ref_filetime.bits) continue; init = InterlockedCompareExchange64((LONGLONG*)&__ref_perftime.bits, (LONGLONG)ref_perftime.bits, (LONGLONG)ref_perftime.bits); if (init == ref_perftime.bits) break; } return us; error: /* only if there is no performance counter */ return -1; /* or whatever */ } int periodic_reftime_check() { /* call this function at regular intervals, e.g. once every second */ __int64 cnt1, cnt2, hz; FILETIME systime; double ft; if(!QueryPerformanceFrequency((LARGE_INTEGER*)&hz)) goto error; if(!QueryPerformanceCounter((LARGE_INTEGER*)&cnt1)) goto error; GetSystemTimeAsFileTime(&systime); __ref_filetime.us = (double)(((((__int64)(systime.dwHighDateTime)) << 32) | ((__int64)(systime.dwLowDateTime)))/10); if(!QueryPerformanceCounter((LARGE_INTEGER*)&cnt2)) goto error; __ref_perftime.us = 500000*(cnt1 + cnt2)/((double)hz); return 0; error: /* only if there is no performance counter */ return -1; }
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4