28#if defined(_WIN32) && ! defined(__CYGWIN__)
30#ifdef HAVE_CLOCK_GETTIME
31#undef HAVE_CLOCK_GETTIME
33#ifdef HAVE_GETTIMEOFDAY
34#undef HAVE_GETTIMEOFDAY
45#ifdef HAVE_CLOCK_GET_TIME
48#include <mach/clock.h>
51#define _MHD_INVALID_CLOCK_SERV ((clock_serv_t) -2)
53static clock_serv_t mono_clock_service = _MHD_INVALID_CLOCK_SERV;
57#ifndef WIN32_LEAN_AND_MEAN
59#define WIN32_LEAN_AND_MEAN 1
66#define NULL ((void*)0)
69#ifdef HAVE_CLOCK_GETTIME
71#define _MHD_UNWANTED_CLOCK CLOCK_REALTIME
73#define _MHD_UNWANTED_CLOCK ((clockid_t) -2)
76static clockid_t mono_clock_id = _MHD_UNWANTED_CLOCK;
80#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_GET_TIME) || \
81 defined(HAVE_GETHRTIME)
82static time_t mono_clock_start;
84#if defined(HAVE_TIMESPEC_GET) || defined(HAVE_GETTIMEOFDAY)
86static time_t gettime_start;
90static hrtime_t hrtime_start;
93#if _WIN32_WINNT >= 0x0600
94static uint64_t tick_start;
96static uint64_t perf_freq;
97static uint64_t perf_start;
145#ifdef HAVE_CLOCK_GET_TIME
146 mach_timespec_t cur_time;
149#ifdef HAVE_CLOCK_GETTIME
152 mono_clock_id = _MHD_UNWANTED_CLOCK;
154#ifdef HAVE_CLOCK_GET_TIME
155 mono_clock_service = _MHD_INVALID_CLOCK_SERV;
165#ifdef HAVE_CLOCK_GETTIME
166#ifdef CLOCK_MONOTONIC_COARSE
170 if (0 == clock_gettime (CLOCK_MONOTONIC_COARSE,
173 mono_clock_id = CLOCK_MONOTONIC_COARSE;
174 mono_clock_start = ts.tv_sec;
179#ifdef CLOCK_MONOTONIC_FAST
182 if (0 == clock_gettime (CLOCK_MONOTONIC_FAST,
185 mono_clock_id = CLOCK_MONOTONIC_FAST;
186 mono_clock_start = ts.tv_sec;
191#ifdef CLOCK_MONOTONIC_RAW_APPROX
195 if (0 == clock_gettime (CLOCK_MONOTONIC_RAW_APPROX,
198 mono_clock_id = CLOCK_MONOTONIC_RAW_APPROX;
199 mono_clock_start = ts.tv_sec;
204#ifdef CLOCK_MONOTONIC_RAW
208 if (0 == clock_gettime (CLOCK_MONOTONIC_RAW,
211 mono_clock_id = CLOCK_MONOTONIC_RAW;
212 mono_clock_start = ts.tv_sec;
220 if (0 == clock_gettime (CLOCK_BOOTTIME,
223 mono_clock_id = CLOCK_BOOTTIME;
224 mono_clock_start = ts.tv_sec;
229#ifdef CLOCK_MONOTONIC
233 if (0 == clock_gettime (CLOCK_MONOTONIC,
236 mono_clock_id = CLOCK_MONOTONIC;
237 mono_clock_start = ts.tv_sec;
245 if (0 == clock_gettime (CLOCK_UPTIME,
248 mono_clock_id = CLOCK_UPTIME;
249 mono_clock_start = ts.tv_sec;
255#ifdef HAVE_CLOCK_GET_TIME
259 if ( (KERN_SUCCESS == host_get_clock_service (mach_host_self (),
261 &mono_clock_service)) &&
262 (KERN_SUCCESS == clock_get_time (mono_clock_service,
265 mono_clock_start = cur_time.tv_sec;
271#if _WIN32_WINNT >= 0x0600
276 tick_start = GetTickCount64 ();
286 LARGE_INTEGER perf_counter;
288 QueryPerformanceFrequency (&freq);
289 QueryPerformanceCounter (&perf_counter);
290 perf_freq = (uint64_t) freq.QuadPart;
291 perf_start = (uint64_t) perf_counter.QuadPart;
297#ifdef HAVE_CLOCK_GETTIME
301 if (0 == clock_gettime (CLOCK_HIGHRES,
304 mono_clock_id = CLOCK_HIGHRES;
305 mono_clock_start = ts.tv_sec;
316 hrtime_start = gethrtime ();
326#ifdef HAVE_CLOCK_GET_TIME
328 (_MHD_INVALID_CLOCK_SERV != mono_clock_service) )
331 mach_port_deallocate (mach_task_self (),
333 mono_clock_service = _MHD_INVALID_CLOCK_SERV;
336 (void) mono_clock_source;
339#ifdef HAVE_TIMESPEC_GET
343 if (TIME_UTC == timespec_get (&tsg, TIME_UTC))
344 gettime_start = tsg.tv_sec;
348#elif defined(HAVE_GETTIMEOFDAY)
352 if (0 == gettimeofday (&tv,
NULL))
353 gettime_start = tv.tv_sec;
369#ifdef HAVE_CLOCK_GET_TIME
370 if (_MHD_INVALID_CLOCK_SERV != mono_clock_service)
372 mach_port_deallocate (mach_task_self (),
374 mono_clock_service = _MHD_INVALID_CLOCK_SERV;
390#ifdef HAVE_CLOCK_GETTIME
393 if ( (_MHD_UNWANTED_CLOCK != mono_clock_id) &&
394 (0 == clock_gettime (mono_clock_id,
396 return ts.tv_sec - mono_clock_start;
398#ifdef HAVE_CLOCK_GET_TIME
399 if (_MHD_INVALID_CLOCK_SERV != mono_clock_service)
401 mach_timespec_t cur_time;
403 if (KERN_SUCCESS == clock_get_time (mono_clock_service,
405 return cur_time.tv_sec - mono_clock_start;
409#if _WIN32_WINNT >= 0x0600
411 return (time_t) (((uint64_t) (GetTickCount64 () - tick_start)) / 1000);
415 LARGE_INTEGER perf_counter;
417 QueryPerformanceCounter (&perf_counter);
418 return (time_t) (((uint64_t) perf_counter.QuadPart - perf_start)
425 return (time_t) (((uint64_t) (gethrtime () - hrtime_start)) / 1000000000);
442#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_TIMESPEC_GET)
446#ifdef HAVE_CLOCK_GETTIME
447 if ( (_MHD_UNWANTED_CLOCK != mono_clock_id) &&
448 (0 == clock_gettime (mono_clock_id,
450 return (uint64_t) (((uint64_t) (ts.tv_sec - mono_clock_start)) * 1000
451 + (ts.tv_nsec / 1000000));
453#ifdef HAVE_CLOCK_GET_TIME
454 if (_MHD_INVALID_CLOCK_SERV != mono_clock_service)
456 mach_timespec_t cur_time;
458 if (KERN_SUCCESS == clock_get_time (mono_clock_service,
460 return (uint64_t) (((uint64_t) (cur_time.tv_sec - mono_clock_start))
461 * 1000 + (cur_time.tv_nsec / 1000000));
465#if _WIN32_WINNT >= 0x0600
467 return (uint64_t) (GetTickCount64 () - tick_start);
471 LARGE_INTEGER perf_counter;
474 QueryPerformanceCounter (&perf_counter);
475 num_ticks = (uint64_t) (perf_counter.QuadPart - perf_start);
476 return ((num_ticks / perf_freq) * 1000)
477 + ((num_ticks % perf_freq) / (perf_freq / 1000));
483 return ((uint64_t) (gethrtime () - hrtime_start)) / 1000000;
487#ifdef HAVE_TIMESPEC_GET
488 if (TIME_UTC == timespec_get (&ts, TIME_UTC))
489 return (uint64_t) (((uint64_t) (ts.tv_sec - gettime_start)) * 1000
490 + (ts.tv_nsec / 1000000));
491#elif defined(HAVE_GETTIMEOFDAY)
495 if (0 == gettimeofday (&tv,
NULL))
496 return (uint64_t) (((uint64_t) (tv.tv_sec - gettime_start)) * 1000
497 + (tv.tv_usec / 1000));
static time_t sys_clock_start
void MHD_monotonic_sec_counter_finish(void)
time_t MHD_monotonic_sec_counter(void)
void MHD_monotonic_sec_counter_init(void)
@ _MHD_CLOCK_GETTICKCOUNT64
uint64_t MHD_monotonic_msec_counter(void)
internal monotonic clock functions implementations