/** monotonic_clock/src/monotonic_win32.c
*
* By Thomas Habets <thomas@habets.pp.se> 2010
*
* Copied from:
* http://code-factor.blogspot.com/2009/11/monotonic-timers.html
*
* Untested
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <Windows.h>
#include <stdio.h>
const char* monotonic_clock_name = "QueryPerformanceCounter";
/**
* return 1 if clock is actually monotonic, otherwise return 0
*/
int
monotonic_clock_is_monotonic()
{
LARGE_INTEGER t;
if (!QueryPerformanceCounter(&t)
|| !QueryPerformanceFrequency(&t)) {
return 0;
}
return 1;
}
/**
* FIXME: thread safe
*/
double
clock_get_dbl()
{
static double scale_factor;
LARGE_INTEGER count;
BOOL ret = QueryPerformanceCounter(&count);
if (ret == 0) {
return clock_get_dbl_fallback();
}
if (scale_factor == 0.0) {
LARGE_INTEGER frequency;
BOOL ret = QueryPerformanceFrequency(&frequency);
if(ret == 0) {
if (/* DEBUG */ 0) {
fprintf(stderr, "QueryPerformanceFrequency");
}
return clock_get_dbl_fallback();
}
scale_factor = 1.0 / frequency.QuadPart;
}
return count.QuadPart * scale_factor;
}
/* ---- Emacs Variables ----
* Local Variables:
* c-basic-offset: 8
* indent-tabs-mode: nil
* End:
*/