28#if defined(_WIN32) && ! defined(__CYGWIN__) && defined(HAVE_CLOCK_GETTIME)
30#undef HAVE_CLOCK_GETTIME
33#ifdef HAVE_CLOCK_GETTIME
48#ifdef HAVE_CLOCK_GET_TIME
51#include <mach/clock.h>
54#define _MHD_INVALID_CLOCK_SERV ((clock_serv_t) -2)
56static clock_serv_t mono_clock_service = _MHD_INVALID_CLOCK_SERV;
60#ifndef WIN32_LEAN_AND_MEAN
62#define WIN32_LEAN_AND_MEAN 1
68#ifdef HAVE_CLOCK_GETTIME
70#define _MHD_UNWANTED_CLOCK CLOCK_REALTIME
72#define _MHD_UNWANTED_CLOCK ((clockid_t) -2)
75static clockid_t mono_clock_id = _MHD_UNWANTED_CLOCK;
79#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_GET_TIME) || \
80 defined(HAVE_GETHRTIME)
81static time_t mono_clock_start;
85static hrtime_t hrtime_start;
88#if _WIN32_WINNT >= 0x0600
89static uint64_t tick_start;
91static int64_t perf_freq;
92static int64_t perf_start;
140#ifdef HAVE_CLOCK_GET_TIME
141 mach_timespec_t cur_time;
144#ifdef HAVE_CLOCK_GETTIME
147 mono_clock_id = _MHD_UNWANTED_CLOCK;
149#ifdef HAVE_CLOCK_GET_TIME
150 mono_clock_service = _MHD_INVALID_CLOCK_SERV;
159#ifdef HAVE_CLOCK_GETTIME
160#ifdef CLOCK_MONOTONIC_COARSE
164 if (0 == clock_gettime (CLOCK_MONOTONIC_COARSE,
167 mono_clock_id = CLOCK_MONOTONIC_COARSE;
168 mono_clock_start = ts.tv_sec;
173#ifdef CLOCK_MONOTONIC_FAST
176 if (0 == clock_gettime (CLOCK_MONOTONIC_FAST,
179 mono_clock_id = CLOCK_MONOTONIC_FAST;
180 mono_clock_start = ts.tv_sec;
185#ifdef CLOCK_MONOTONIC_RAW
188 if (0 == clock_gettime (CLOCK_MONOTONIC_RAW,
191 mono_clock_id = CLOCK_MONOTONIC_RAW;
192 mono_clock_start = ts.tv_sec;
201 if (0 == clock_gettime (CLOCK_BOOTTIME,
204 mono_clock_id = CLOCK_BOOTTIME;
205 mono_clock_start = ts.tv_sec;
210#ifdef CLOCK_MONOTONIC
214 if (0 == clock_gettime (CLOCK_MONOTONIC,
217 mono_clock_id = CLOCK_MONOTONIC;
218 mono_clock_start = ts.tv_sec;
224#ifdef HAVE_CLOCK_GET_TIME
228 if ( (KERN_SUCCESS == host_get_clock_service (mach_host_self (),
230 &mono_clock_service)) &&
231 (KERN_SUCCESS == clock_get_time (mono_clock_service,
234 mono_clock_start = cur_time.tv_sec;
240#if _WIN32_WINNT >= 0x0600
245 tick_start = GetTickCount64 ();
255 LARGE_INTEGER perf_counter;
257 QueryPerformanceFrequency (&freq);
258 QueryPerformanceCounter (&perf_counter);
259 perf_freq = freq.QuadPart;
260 perf_start = perf_counter.QuadPart;
266#ifdef HAVE_CLOCK_GETTIME
270 if (0 == clock_gettime (CLOCK_HIGHRES,
273 mono_clock_id = CLOCK_HIGHRES;
274 mono_clock_start = ts.tv_sec;
285 hrtime_start = gethrtime ();
295#ifdef HAVE_CLOCK_GET_TIME
297 (_MHD_INVALID_CLOCK_SERV != mono_clock_service) )
300 mach_port_deallocate (mach_task_self (),
302 mono_clock_service = _MHD_INVALID_CLOCK_SERV;
305 (void) mono_clock_source;
318#ifdef HAVE_CLOCK_GET_TIME
319 if (_MHD_INVALID_CLOCK_SERV != mono_clock_service)
321 mach_port_deallocate (mach_task_self (),
323 mono_clock_service = _MHD_INVALID_CLOCK_SERV;
339#ifdef HAVE_CLOCK_GETTIME
342 if ( (_MHD_UNWANTED_CLOCK != mono_clock_id) &&
343 (0 == clock_gettime (mono_clock_id,
345 return ts.tv_sec - mono_clock_start;
347#ifdef HAVE_CLOCK_GET_TIME
348 if (_MHD_INVALID_CLOCK_SERV != mono_clock_service)
350 mach_timespec_t cur_time;
352 if (KERN_SUCCESS == clock_get_time (mono_clock_service,
354 return cur_time.tv_sec - mono_clock_start;
358#if _WIN32_WINNT >= 0x0600
360 return (time_t) (((uint64_t) (GetTickCount64 () - tick_start)) / 1000);
364 LARGE_INTEGER perf_counter;
366 QueryPerformanceCounter (&perf_counter);
367 return (time_t) (((uint64_t) (perf_counter.QuadPart - perf_start))
374 return (time_t) (((uint64_t) (gethrtime () - hrtime_start)) / 1000000000);
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
internal monotonic clock functions implementations