28 #if defined(_WIN32) && ! defined(__CYGWIN__) && defined(HAVE_CLOCK_GETTIME)
30 #undef HAVE_CLOCK_GETTIME
33 #ifdef HAVE_CLOCK_GETTIME
38 #ifdef HAVE_SYS_TIME_H
48 #ifdef HAVE_CLOCK_GET_TIME
49 #include <mach/mach.h>
51 #include <mach/clock.h>
54 #define _MHD_INVALID_CLOCK_SERV ((clock_serv_t) -2)
56 static 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)
75 static clockid_t mono_clock_id = _MHD_UNWANTED_CLOCK;
79 #if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_GET_TIME) || \
80 defined(HAVE_GETHRTIME)
81 static time_t mono_clock_start;
85 static hrtime_t hrtime_start;
88 #if _WIN32_WINNT >= 0x0600
89 static uint64_t tick_start;
91 static int64_t perf_freq;
92 static 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;
197 #ifdef CLOCK_BOOTTIME
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;
280 #ifdef HAVE_GETHRTIME
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))
372 #ifdef HAVE_GETHRTIME
374 return (time_t) (((uint64_t) (gethrtime () - hrtime_start)) / 1000000000);
void MHD_monotonic_sec_counter_finish(void)
time_t MHD_monotonic_sec_counter(void)
void MHD_monotonic_sec_counter_init(void)
@ _MHD_CLOCK_GETTICKCOUNT64
static time_t sys_clock_start
internal monotonic clock functions implementations