xref: /aosp_15_r20/external/libevent/evutil_time.c (revision 663afb9b963571284e0f0a60f257164ab54f64bf)
1*663afb9bSAndroid Build Coastguard Worker /*
2*663afb9bSAndroid Build Coastguard Worker  * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
3*663afb9bSAndroid Build Coastguard Worker  *
4*663afb9bSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
5*663afb9bSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
6*663afb9bSAndroid Build Coastguard Worker  * are met:
7*663afb9bSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
8*663afb9bSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
9*663afb9bSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
10*663afb9bSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
11*663afb9bSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
12*663afb9bSAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
13*663afb9bSAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
14*663afb9bSAndroid Build Coastguard Worker  *
15*663afb9bSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16*663afb9bSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17*663afb9bSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18*663afb9bSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19*663afb9bSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20*663afb9bSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21*663afb9bSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22*663afb9bSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23*663afb9bSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24*663afb9bSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25*663afb9bSAndroid Build Coastguard Worker  */
26*663afb9bSAndroid Build Coastguard Worker 
27*663afb9bSAndroid Build Coastguard Worker #include "event2/event-config.h"
28*663afb9bSAndroid Build Coastguard Worker #include "evconfig-private.h"
29*663afb9bSAndroid Build Coastguard Worker 
30*663afb9bSAndroid Build Coastguard Worker #ifdef _WIN32
31*663afb9bSAndroid Build Coastguard Worker #include <winsock2.h>
32*663afb9bSAndroid Build Coastguard Worker #define WIN32_LEAN_AND_MEAN
33*663afb9bSAndroid Build Coastguard Worker #include <windows.h>
34*663afb9bSAndroid Build Coastguard Worker #undef WIN32_LEAN_AND_MEAN
35*663afb9bSAndroid Build Coastguard Worker #endif
36*663afb9bSAndroid Build Coastguard Worker 
37*663afb9bSAndroid Build Coastguard Worker #include <sys/types.h>
38*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_STDLIB_H
39*663afb9bSAndroid Build Coastguard Worker #include <stdlib.h>
40*663afb9bSAndroid Build Coastguard Worker #endif
41*663afb9bSAndroid Build Coastguard Worker #include <errno.h>
42*663afb9bSAndroid Build Coastguard Worker #include <limits.h>
43*663afb9bSAndroid Build Coastguard Worker #ifndef EVENT__HAVE_GETTIMEOFDAY
44*663afb9bSAndroid Build Coastguard Worker #include <sys/timeb.h>
45*663afb9bSAndroid Build Coastguard Worker #endif
46*663afb9bSAndroid Build Coastguard Worker #if !defined(EVENT__HAVE_NANOSLEEP) && !defined(EVENT__HAVE_USLEEP) && \
47*663afb9bSAndroid Build Coastguard Worker 	!defined(_WIN32)
48*663afb9bSAndroid Build Coastguard Worker #include <sys/select.h>
49*663afb9bSAndroid Build Coastguard Worker #endif
50*663afb9bSAndroid Build Coastguard Worker #include <time.h>
51*663afb9bSAndroid Build Coastguard Worker #include <sys/stat.h>
52*663afb9bSAndroid Build Coastguard Worker #include <string.h>
53*663afb9bSAndroid Build Coastguard Worker 
54*663afb9bSAndroid Build Coastguard Worker /** evutil_usleep_() */
55*663afb9bSAndroid Build Coastguard Worker #if defined(_WIN32)
56*663afb9bSAndroid Build Coastguard Worker #elif defined(EVENT__HAVE_NANOSLEEP)
57*663afb9bSAndroid Build Coastguard Worker #elif defined(EVENT__HAVE_USLEEP)
58*663afb9bSAndroid Build Coastguard Worker #include <unistd.h>
59*663afb9bSAndroid Build Coastguard Worker #endif
60*663afb9bSAndroid Build Coastguard Worker 
61*663afb9bSAndroid Build Coastguard Worker #include "event2/util.h"
62*663afb9bSAndroid Build Coastguard Worker #include "util-internal.h"
63*663afb9bSAndroid Build Coastguard Worker #include "log-internal.h"
64*663afb9bSAndroid Build Coastguard Worker #include "mm-internal.h"
65*663afb9bSAndroid Build Coastguard Worker 
66*663afb9bSAndroid Build Coastguard Worker #ifndef EVENT__HAVE_GETTIMEOFDAY
67*663afb9bSAndroid Build Coastguard Worker /* No gettimeofday; this must be windows. */
68*663afb9bSAndroid Build Coastguard Worker 
69*663afb9bSAndroid Build Coastguard Worker typedef void (WINAPI *GetSystemTimePreciseAsFileTime_fn_t) (LPFILETIME);
70*663afb9bSAndroid Build Coastguard Worker 
71*663afb9bSAndroid Build Coastguard Worker int
evutil_gettimeofday(struct timeval * tv,struct timezone * tz)72*663afb9bSAndroid Build Coastguard Worker evutil_gettimeofday(struct timeval *tv, struct timezone *tz)
73*663afb9bSAndroid Build Coastguard Worker {
74*663afb9bSAndroid Build Coastguard Worker #ifdef _MSC_VER
75*663afb9bSAndroid Build Coastguard Worker #define U64_LITERAL(n) n##ui64
76*663afb9bSAndroid Build Coastguard Worker #else
77*663afb9bSAndroid Build Coastguard Worker #define U64_LITERAL(n) n##llu
78*663afb9bSAndroid Build Coastguard Worker #endif
79*663afb9bSAndroid Build Coastguard Worker 
80*663afb9bSAndroid Build Coastguard Worker 	/* Conversion logic taken from Tor, which in turn took it
81*663afb9bSAndroid Build Coastguard Worker 	 * from Perl.  GetSystemTimeAsFileTime returns its value as
82*663afb9bSAndroid Build Coastguard Worker 	 * an unaligned (!) 64-bit value containing the number of
83*663afb9bSAndroid Build Coastguard Worker 	 * 100-nanosecond intervals since 1 January 1601 UTC. */
84*663afb9bSAndroid Build Coastguard Worker #define EPOCH_BIAS U64_LITERAL(116444736000000000)
85*663afb9bSAndroid Build Coastguard Worker #define UNITS_PER_SEC U64_LITERAL(10000000)
86*663afb9bSAndroid Build Coastguard Worker #define USEC_PER_SEC U64_LITERAL(1000000)
87*663afb9bSAndroid Build Coastguard Worker #define UNITS_PER_USEC U64_LITERAL(10)
88*663afb9bSAndroid Build Coastguard Worker 	union {
89*663afb9bSAndroid Build Coastguard Worker 		FILETIME ft_ft;
90*663afb9bSAndroid Build Coastguard Worker 		ev_uint64_t ft_64;
91*663afb9bSAndroid Build Coastguard Worker 	} ft;
92*663afb9bSAndroid Build Coastguard Worker 
93*663afb9bSAndroid Build Coastguard Worker 	if (tv == NULL)
94*663afb9bSAndroid Build Coastguard Worker 		return -1;
95*663afb9bSAndroid Build Coastguard Worker 
96*663afb9bSAndroid Build Coastguard Worker 	static GetSystemTimePreciseAsFileTime_fn_t GetSystemTimePreciseAsFileTime_fn = NULL;
97*663afb9bSAndroid Build Coastguard Worker 	static int check_precise = 1;
98*663afb9bSAndroid Build Coastguard Worker 
99*663afb9bSAndroid Build Coastguard Worker 	if (EVUTIL_UNLIKELY(check_precise)) {
100*663afb9bSAndroid Build Coastguard Worker 		HMODULE h = evutil_load_windows_system_library_(TEXT("kernel32.dll"));
101*663afb9bSAndroid Build Coastguard Worker 		if (h != NULL)
102*663afb9bSAndroid Build Coastguard Worker 			GetSystemTimePreciseAsFileTime_fn =
103*663afb9bSAndroid Build Coastguard Worker 				(GetSystemTimePreciseAsFileTime_fn_t)
104*663afb9bSAndroid Build Coastguard Worker 					GetProcAddress(h, "GetSystemTimePreciseAsFileTime");
105*663afb9bSAndroid Build Coastguard Worker 		check_precise = 0;
106*663afb9bSAndroid Build Coastguard Worker 	}
107*663afb9bSAndroid Build Coastguard Worker 
108*663afb9bSAndroid Build Coastguard Worker 	if (GetSystemTimePreciseAsFileTime_fn != NULL)
109*663afb9bSAndroid Build Coastguard Worker 		GetSystemTimePreciseAsFileTime_fn(&ft.ft_ft);
110*663afb9bSAndroid Build Coastguard Worker 	else
111*663afb9bSAndroid Build Coastguard Worker 		GetSystemTimeAsFileTime(&ft.ft_ft);
112*663afb9bSAndroid Build Coastguard Worker 
113*663afb9bSAndroid Build Coastguard Worker 	if (EVUTIL_UNLIKELY(ft.ft_64 < EPOCH_BIAS)) {
114*663afb9bSAndroid Build Coastguard Worker 		/* Time before the unix epoch. */
115*663afb9bSAndroid Build Coastguard Worker 		return -1;
116*663afb9bSAndroid Build Coastguard Worker 	}
117*663afb9bSAndroid Build Coastguard Worker 	ft.ft_64 -= EPOCH_BIAS;
118*663afb9bSAndroid Build Coastguard Worker 	tv->tv_sec = (long) (ft.ft_64 / UNITS_PER_SEC);
119*663afb9bSAndroid Build Coastguard Worker 	tv->tv_usec = (long) ((ft.ft_64 / UNITS_PER_USEC) % USEC_PER_SEC);
120*663afb9bSAndroid Build Coastguard Worker 	return 0;
121*663afb9bSAndroid Build Coastguard Worker }
122*663afb9bSAndroid Build Coastguard Worker #endif
123*663afb9bSAndroid Build Coastguard Worker 
124*663afb9bSAndroid Build Coastguard Worker #define MAX_SECONDS_IN_MSEC_LONG \
125*663afb9bSAndroid Build Coastguard Worker 	(((LONG_MAX) - 999) / 1000)
126*663afb9bSAndroid Build Coastguard Worker 
127*663afb9bSAndroid Build Coastguard Worker long
evutil_tv_to_msec_(const struct timeval * tv)128*663afb9bSAndroid Build Coastguard Worker evutil_tv_to_msec_(const struct timeval *tv)
129*663afb9bSAndroid Build Coastguard Worker {
130*663afb9bSAndroid Build Coastguard Worker 	if (tv->tv_usec > 1000000 || tv->tv_sec > MAX_SECONDS_IN_MSEC_LONG)
131*663afb9bSAndroid Build Coastguard Worker 		return -1;
132*663afb9bSAndroid Build Coastguard Worker 
133*663afb9bSAndroid Build Coastguard Worker 	return (tv->tv_sec * 1000) + ((tv->tv_usec + 999) / 1000);
134*663afb9bSAndroid Build Coastguard Worker }
135*663afb9bSAndroid Build Coastguard Worker 
136*663afb9bSAndroid Build Coastguard Worker /*
137*663afb9bSAndroid Build Coastguard Worker   Replacement for usleep on platforms that don't have one.  Not guaranteed to
138*663afb9bSAndroid Build Coastguard Worker   be any more finegrained than 1 msec.
139*663afb9bSAndroid Build Coastguard Worker  */
140*663afb9bSAndroid Build Coastguard Worker void
evutil_usleep_(const struct timeval * tv)141*663afb9bSAndroid Build Coastguard Worker evutil_usleep_(const struct timeval *tv)
142*663afb9bSAndroid Build Coastguard Worker {
143*663afb9bSAndroid Build Coastguard Worker 	if (!tv)
144*663afb9bSAndroid Build Coastguard Worker 		return;
145*663afb9bSAndroid Build Coastguard Worker #if defined(_WIN32)
146*663afb9bSAndroid Build Coastguard Worker 	{
147*663afb9bSAndroid Build Coastguard Worker 		__int64 usec;
148*663afb9bSAndroid Build Coastguard Worker 		LARGE_INTEGER li;
149*663afb9bSAndroid Build Coastguard Worker 		HANDLE timer;
150*663afb9bSAndroid Build Coastguard Worker 
151*663afb9bSAndroid Build Coastguard Worker 		usec = tv->tv_sec * 1000000LL + tv->tv_usec;
152*663afb9bSAndroid Build Coastguard Worker 		if (!usec)
153*663afb9bSAndroid Build Coastguard Worker 			return;
154*663afb9bSAndroid Build Coastguard Worker 
155*663afb9bSAndroid Build Coastguard Worker 		li.QuadPart = -10LL * usec;
156*663afb9bSAndroid Build Coastguard Worker 		timer = CreateWaitableTimer(NULL, TRUE, NULL);
157*663afb9bSAndroid Build Coastguard Worker 		if (!timer)
158*663afb9bSAndroid Build Coastguard Worker 			return;
159*663afb9bSAndroid Build Coastguard Worker 
160*663afb9bSAndroid Build Coastguard Worker 		SetWaitableTimer(timer, &li, 0, NULL, NULL, 0);
161*663afb9bSAndroid Build Coastguard Worker 		WaitForSingleObject(timer, INFINITE);
162*663afb9bSAndroid Build Coastguard Worker 		CloseHandle(timer);
163*663afb9bSAndroid Build Coastguard Worker 	}
164*663afb9bSAndroid Build Coastguard Worker #elif defined(EVENT__HAVE_NANOSLEEP)
165*663afb9bSAndroid Build Coastguard Worker 	{
166*663afb9bSAndroid Build Coastguard Worker 		struct timespec ts;
167*663afb9bSAndroid Build Coastguard Worker 		ts.tv_sec = tv->tv_sec;
168*663afb9bSAndroid Build Coastguard Worker 		ts.tv_nsec = tv->tv_usec*1000;
169*663afb9bSAndroid Build Coastguard Worker 		nanosleep(&ts, NULL);
170*663afb9bSAndroid Build Coastguard Worker 	}
171*663afb9bSAndroid Build Coastguard Worker #elif defined(EVENT__HAVE_USLEEP)
172*663afb9bSAndroid Build Coastguard Worker 	/* Some systems don't like to usleep more than 999999 usec */
173*663afb9bSAndroid Build Coastguard Worker 	sleep(tv->tv_sec);
174*663afb9bSAndroid Build Coastguard Worker 	usleep(tv->tv_usec);
175*663afb9bSAndroid Build Coastguard Worker #else
176*663afb9bSAndroid Build Coastguard Worker 	{
177*663afb9bSAndroid Build Coastguard Worker 		struct timeval tv2 = *tv;
178*663afb9bSAndroid Build Coastguard Worker 		select(0, NULL, NULL, NULL, &tv2);
179*663afb9bSAndroid Build Coastguard Worker 	}
180*663afb9bSAndroid Build Coastguard Worker #endif
181*663afb9bSAndroid Build Coastguard Worker }
182*663afb9bSAndroid Build Coastguard Worker 
183*663afb9bSAndroid Build Coastguard Worker int
evutil_date_rfc1123(char * date,const size_t datelen,const struct tm * tm)184*663afb9bSAndroid Build Coastguard Worker evutil_date_rfc1123(char *date, const size_t datelen, const struct tm *tm)
185*663afb9bSAndroid Build Coastguard Worker {
186*663afb9bSAndroid Build Coastguard Worker 	static const char *DAYS[] =
187*663afb9bSAndroid Build Coastguard Worker 		{ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
188*663afb9bSAndroid Build Coastguard Worker 	static const char *MONTHS[] =
189*663afb9bSAndroid Build Coastguard Worker 		{ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
190*663afb9bSAndroid Build Coastguard Worker 
191*663afb9bSAndroid Build Coastguard Worker 	time_t t = time(NULL);
192*663afb9bSAndroid Build Coastguard Worker 
193*663afb9bSAndroid Build Coastguard Worker #if defined(EVENT__HAVE__GMTIME64_S) || !defined(_WIN32)
194*663afb9bSAndroid Build Coastguard Worker 	struct tm sys;
195*663afb9bSAndroid Build Coastguard Worker #endif
196*663afb9bSAndroid Build Coastguard Worker 
197*663afb9bSAndroid Build Coastguard Worker 	/* If `tm` is null, set system's current time. */
198*663afb9bSAndroid Build Coastguard Worker 	if (tm == NULL) {
199*663afb9bSAndroid Build Coastguard Worker #if !defined(_WIN32)
200*663afb9bSAndroid Build Coastguard Worker 		gmtime_r(&t, &sys);
201*663afb9bSAndroid Build Coastguard Worker 		tm = &sys;
202*663afb9bSAndroid Build Coastguard Worker 		/** detect _gmtime64()/_gmtime64_s() */
203*663afb9bSAndroid Build Coastguard Worker #elif defined(EVENT__HAVE__GMTIME64_S)
204*663afb9bSAndroid Build Coastguard Worker 		errno_t err;
205*663afb9bSAndroid Build Coastguard Worker 		err = _gmtime64_s(&sys, &t);
206*663afb9bSAndroid Build Coastguard Worker 		if (err) {
207*663afb9bSAndroid Build Coastguard Worker 			event_errx(1, "Invalid argument to _gmtime64_s");
208*663afb9bSAndroid Build Coastguard Worker 		} else {
209*663afb9bSAndroid Build Coastguard Worker 			tm = &sys;
210*663afb9bSAndroid Build Coastguard Worker 		}
211*663afb9bSAndroid Build Coastguard Worker #elif defined(EVENT__HAVE__GMTIME64)
212*663afb9bSAndroid Build Coastguard Worker 		tm = _gmtime64(&t);
213*663afb9bSAndroid Build Coastguard Worker #else
214*663afb9bSAndroid Build Coastguard Worker 		tm = gmtime(&t);
215*663afb9bSAndroid Build Coastguard Worker #endif
216*663afb9bSAndroid Build Coastguard Worker 	}
217*663afb9bSAndroid Build Coastguard Worker 
218*663afb9bSAndroid Build Coastguard Worker 	return evutil_snprintf(
219*663afb9bSAndroid Build Coastguard Worker 		date, datelen, "%s, %02d %s %4d %02d:%02d:%02d GMT",
220*663afb9bSAndroid Build Coastguard Worker 		DAYS[tm->tm_wday], tm->tm_mday, MONTHS[tm->tm_mon],
221*663afb9bSAndroid Build Coastguard Worker 		1900 + tm->tm_year, tm->tm_hour, tm->tm_min, tm->tm_sec);
222*663afb9bSAndroid Build Coastguard Worker }
223*663afb9bSAndroid Build Coastguard Worker 
224*663afb9bSAndroid Build Coastguard Worker /*
225*663afb9bSAndroid Build Coastguard Worker    This function assumes it's called repeatedly with a
226*663afb9bSAndroid Build Coastguard Worker    not-actually-so-monotonic time source whose outputs are in 'tv'. It
227*663afb9bSAndroid Build Coastguard Worker    implements a trivial ratcheting mechanism so that the values never go
228*663afb9bSAndroid Build Coastguard Worker    backwards.
229*663afb9bSAndroid Build Coastguard Worker  */
230*663afb9bSAndroid Build Coastguard Worker static void
adjust_monotonic_time(struct evutil_monotonic_timer * base,struct timeval * tv)231*663afb9bSAndroid Build Coastguard Worker adjust_monotonic_time(struct evutil_monotonic_timer *base,
232*663afb9bSAndroid Build Coastguard Worker     struct timeval *tv)
233*663afb9bSAndroid Build Coastguard Worker {
234*663afb9bSAndroid Build Coastguard Worker 	evutil_timeradd(tv, &base->adjust_monotonic_clock, tv);
235*663afb9bSAndroid Build Coastguard Worker 
236*663afb9bSAndroid Build Coastguard Worker 	if (evutil_timercmp(tv, &base->last_time, <)) {
237*663afb9bSAndroid Build Coastguard Worker 		/* Guess it wasn't monotonic after all. */
238*663afb9bSAndroid Build Coastguard Worker 		struct timeval adjust;
239*663afb9bSAndroid Build Coastguard Worker 		evutil_timersub(&base->last_time, tv, &adjust);
240*663afb9bSAndroid Build Coastguard Worker 		evutil_timeradd(&adjust, &base->adjust_monotonic_clock,
241*663afb9bSAndroid Build Coastguard Worker 		    &base->adjust_monotonic_clock);
242*663afb9bSAndroid Build Coastguard Worker 		*tv = base->last_time;
243*663afb9bSAndroid Build Coastguard Worker 	}
244*663afb9bSAndroid Build Coastguard Worker 	base->last_time = *tv;
245*663afb9bSAndroid Build Coastguard Worker }
246*663afb9bSAndroid Build Coastguard Worker 
247*663afb9bSAndroid Build Coastguard Worker /*
248*663afb9bSAndroid Build Coastguard Worker    Allocate a new struct evutil_monotonic_timer
249*663afb9bSAndroid Build Coastguard Worker  */
250*663afb9bSAndroid Build Coastguard Worker struct evutil_monotonic_timer *
evutil_monotonic_timer_new(void)251*663afb9bSAndroid Build Coastguard Worker evutil_monotonic_timer_new(void)
252*663afb9bSAndroid Build Coastguard Worker {
253*663afb9bSAndroid Build Coastguard Worker   struct evutil_monotonic_timer *p = NULL;
254*663afb9bSAndroid Build Coastguard Worker 
255*663afb9bSAndroid Build Coastguard Worker   p = mm_malloc(sizeof(*p));
256*663afb9bSAndroid Build Coastguard Worker   if (!p) goto done;
257*663afb9bSAndroid Build Coastguard Worker 
258*663afb9bSAndroid Build Coastguard Worker   memset(p, 0, sizeof(*p));
259*663afb9bSAndroid Build Coastguard Worker 
260*663afb9bSAndroid Build Coastguard Worker  done:
261*663afb9bSAndroid Build Coastguard Worker   return p;
262*663afb9bSAndroid Build Coastguard Worker }
263*663afb9bSAndroid Build Coastguard Worker 
264*663afb9bSAndroid Build Coastguard Worker /*
265*663afb9bSAndroid Build Coastguard Worker    Free a struct evutil_monotonic_timer
266*663afb9bSAndroid Build Coastguard Worker  */
267*663afb9bSAndroid Build Coastguard Worker void
evutil_monotonic_timer_free(struct evutil_monotonic_timer * timer)268*663afb9bSAndroid Build Coastguard Worker evutil_monotonic_timer_free(struct evutil_monotonic_timer *timer)
269*663afb9bSAndroid Build Coastguard Worker {
270*663afb9bSAndroid Build Coastguard Worker   if (timer) {
271*663afb9bSAndroid Build Coastguard Worker     mm_free(timer);
272*663afb9bSAndroid Build Coastguard Worker   }
273*663afb9bSAndroid Build Coastguard Worker }
274*663afb9bSAndroid Build Coastguard Worker 
275*663afb9bSAndroid Build Coastguard Worker /*
276*663afb9bSAndroid Build Coastguard Worker    Set up a struct evutil_monotonic_timer for initial use
277*663afb9bSAndroid Build Coastguard Worker  */
278*663afb9bSAndroid Build Coastguard Worker int
evutil_configure_monotonic_time(struct evutil_monotonic_timer * timer,int flags)279*663afb9bSAndroid Build Coastguard Worker evutil_configure_monotonic_time(struct evutil_monotonic_timer *timer,
280*663afb9bSAndroid Build Coastguard Worker                                 int flags)
281*663afb9bSAndroid Build Coastguard Worker {
282*663afb9bSAndroid Build Coastguard Worker   return evutil_configure_monotonic_time_(timer, flags);
283*663afb9bSAndroid Build Coastguard Worker }
284*663afb9bSAndroid Build Coastguard Worker 
285*663afb9bSAndroid Build Coastguard Worker /*
286*663afb9bSAndroid Build Coastguard Worker    Query the current monotonic time
287*663afb9bSAndroid Build Coastguard Worker  */
288*663afb9bSAndroid Build Coastguard Worker int
evutil_gettime_monotonic(struct evutil_monotonic_timer * timer,struct timeval * tp)289*663afb9bSAndroid Build Coastguard Worker evutil_gettime_monotonic(struct evutil_monotonic_timer *timer,
290*663afb9bSAndroid Build Coastguard Worker                          struct timeval *tp)
291*663afb9bSAndroid Build Coastguard Worker {
292*663afb9bSAndroid Build Coastguard Worker   return evutil_gettime_monotonic_(timer, tp);
293*663afb9bSAndroid Build Coastguard Worker }
294*663afb9bSAndroid Build Coastguard Worker 
295*663afb9bSAndroid Build Coastguard Worker 
296*663afb9bSAndroid Build Coastguard Worker #if defined(HAVE_POSIX_MONOTONIC)
297*663afb9bSAndroid Build Coastguard Worker /* =====
298*663afb9bSAndroid Build Coastguard Worker    The POSIX clock_gettime() interface provides a few ways to get at a
299*663afb9bSAndroid Build Coastguard Worker    monotonic clock.  CLOCK_MONOTONIC is most widely supported.  Linux also
300*663afb9bSAndroid Build Coastguard Worker    provides a CLOCK_MONOTONIC_COARSE with accuracy of about 1-4 msec.
301*663afb9bSAndroid Build Coastguard Worker 
302*663afb9bSAndroid Build Coastguard Worker    On all platforms I'm aware of, CLOCK_MONOTONIC really is monotonic.
303*663afb9bSAndroid Build Coastguard Worker    Platforms don't agree about whether it should jump on a sleep/resume.
304*663afb9bSAndroid Build Coastguard Worker  */
305*663afb9bSAndroid Build Coastguard Worker 
306*663afb9bSAndroid Build Coastguard Worker int
evutil_configure_monotonic_time_(struct evutil_monotonic_timer * base,int flags)307*663afb9bSAndroid Build Coastguard Worker evutil_configure_monotonic_time_(struct evutil_monotonic_timer *base,
308*663afb9bSAndroid Build Coastguard Worker     int flags)
309*663afb9bSAndroid Build Coastguard Worker {
310*663afb9bSAndroid Build Coastguard Worker 	/* CLOCK_MONOTONIC exists on FreeBSD, Linux, and Solaris.  You need to
311*663afb9bSAndroid Build Coastguard Worker 	 * check for it at runtime, because some older kernel versions won't
312*663afb9bSAndroid Build Coastguard Worker 	 * have it working. */
313*663afb9bSAndroid Build Coastguard Worker #ifdef CLOCK_MONOTONIC_COARSE
314*663afb9bSAndroid Build Coastguard Worker 	const int precise = flags & EV_MONOT_PRECISE;
315*663afb9bSAndroid Build Coastguard Worker #endif
316*663afb9bSAndroid Build Coastguard Worker 	const int fallback = flags & EV_MONOT_FALLBACK;
317*663afb9bSAndroid Build Coastguard Worker 	struct timespec	ts;
318*663afb9bSAndroid Build Coastguard Worker 
319*663afb9bSAndroid Build Coastguard Worker #ifdef CLOCK_MONOTONIC_COARSE
320*663afb9bSAndroid Build Coastguard Worker 	if (CLOCK_MONOTONIC_COARSE < 0) {
321*663afb9bSAndroid Build Coastguard Worker 		/* Technically speaking, nothing keeps CLOCK_* from being
322*663afb9bSAndroid Build Coastguard Worker 		 * negative (as far as I know). This check and the one below
323*663afb9bSAndroid Build Coastguard Worker 		 * make sure that it's safe for us to use -1 as an "unset"
324*663afb9bSAndroid Build Coastguard Worker 		 * value. */
325*663afb9bSAndroid Build Coastguard Worker 		event_errx(1,"I didn't expect CLOCK_MONOTONIC_COARSE to be < 0");
326*663afb9bSAndroid Build Coastguard Worker 	}
327*663afb9bSAndroid Build Coastguard Worker 	if (! precise && ! fallback) {
328*663afb9bSAndroid Build Coastguard Worker 		if (clock_gettime(CLOCK_MONOTONIC_COARSE, &ts) == 0) {
329*663afb9bSAndroid Build Coastguard Worker 			base->monotonic_clock = CLOCK_MONOTONIC_COARSE;
330*663afb9bSAndroid Build Coastguard Worker 			return 0;
331*663afb9bSAndroid Build Coastguard Worker 		}
332*663afb9bSAndroid Build Coastguard Worker 	}
333*663afb9bSAndroid Build Coastguard Worker #endif
334*663afb9bSAndroid Build Coastguard Worker 	if (!fallback && clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
335*663afb9bSAndroid Build Coastguard Worker 		base->monotonic_clock = CLOCK_MONOTONIC;
336*663afb9bSAndroid Build Coastguard Worker 		return 0;
337*663afb9bSAndroid Build Coastguard Worker 	}
338*663afb9bSAndroid Build Coastguard Worker 
339*663afb9bSAndroid Build Coastguard Worker 	if (CLOCK_MONOTONIC < 0) {
340*663afb9bSAndroid Build Coastguard Worker 		event_errx(1,"I didn't expect CLOCK_MONOTONIC to be < 0");
341*663afb9bSAndroid Build Coastguard Worker 	}
342*663afb9bSAndroid Build Coastguard Worker 
343*663afb9bSAndroid Build Coastguard Worker 	base->monotonic_clock = -1;
344*663afb9bSAndroid Build Coastguard Worker 	return 0;
345*663afb9bSAndroid Build Coastguard Worker }
346*663afb9bSAndroid Build Coastguard Worker 
347*663afb9bSAndroid Build Coastguard Worker int
evutil_gettime_monotonic_(struct evutil_monotonic_timer * base,struct timeval * tp)348*663afb9bSAndroid Build Coastguard Worker evutil_gettime_monotonic_(struct evutil_monotonic_timer *base,
349*663afb9bSAndroid Build Coastguard Worker     struct timeval *tp)
350*663afb9bSAndroid Build Coastguard Worker {
351*663afb9bSAndroid Build Coastguard Worker 	struct timespec ts;
352*663afb9bSAndroid Build Coastguard Worker 
353*663afb9bSAndroid Build Coastguard Worker 	if (base->monotonic_clock < 0) {
354*663afb9bSAndroid Build Coastguard Worker 		if (evutil_gettimeofday(tp, NULL) < 0)
355*663afb9bSAndroid Build Coastguard Worker 			return -1;
356*663afb9bSAndroid Build Coastguard Worker 		adjust_monotonic_time(base, tp);
357*663afb9bSAndroid Build Coastguard Worker 		return 0;
358*663afb9bSAndroid Build Coastguard Worker 	}
359*663afb9bSAndroid Build Coastguard Worker 
360*663afb9bSAndroid Build Coastguard Worker 	if (clock_gettime(base->monotonic_clock, &ts) == -1)
361*663afb9bSAndroid Build Coastguard Worker 		return -1;
362*663afb9bSAndroid Build Coastguard Worker 	tp->tv_sec = ts.tv_sec;
363*663afb9bSAndroid Build Coastguard Worker 	tp->tv_usec = ts.tv_nsec / 1000;
364*663afb9bSAndroid Build Coastguard Worker 
365*663afb9bSAndroid Build Coastguard Worker 	return 0;
366*663afb9bSAndroid Build Coastguard Worker }
367*663afb9bSAndroid Build Coastguard Worker #endif
368*663afb9bSAndroid Build Coastguard Worker 
369*663afb9bSAndroid Build Coastguard Worker #if defined(HAVE_MACH_MONOTONIC)
370*663afb9bSAndroid Build Coastguard Worker /* ======
371*663afb9bSAndroid Build Coastguard Worker    Apple is a little late to the POSIX party.  And why not?  Instead of
372*663afb9bSAndroid Build Coastguard Worker    clock_gettime(), they provide mach_absolute_time().  Its units are not
373*663afb9bSAndroid Build Coastguard Worker    fixed; we need to use mach_timebase_info() to get the right functions to
374*663afb9bSAndroid Build Coastguard Worker    convert its units into nanoseconds.
375*663afb9bSAndroid Build Coastguard Worker 
376*663afb9bSAndroid Build Coastguard Worker    To all appearances, mach_absolute_time() seems to be honest-to-goodness
377*663afb9bSAndroid Build Coastguard Worker    monotonic.  Whether it stops during sleep or not is unspecified in
378*663afb9bSAndroid Build Coastguard Worker    principle, and dependent on CPU architecture in practice.
379*663afb9bSAndroid Build Coastguard Worker  */
380*663afb9bSAndroid Build Coastguard Worker 
381*663afb9bSAndroid Build Coastguard Worker int
evutil_configure_monotonic_time_(struct evutil_monotonic_timer * base,int flags)382*663afb9bSAndroid Build Coastguard Worker evutil_configure_monotonic_time_(struct evutil_monotonic_timer *base,
383*663afb9bSAndroid Build Coastguard Worker     int flags)
384*663afb9bSAndroid Build Coastguard Worker {
385*663afb9bSAndroid Build Coastguard Worker 	const int fallback = flags & EV_MONOT_FALLBACK;
386*663afb9bSAndroid Build Coastguard Worker 	struct mach_timebase_info mi;
387*663afb9bSAndroid Build Coastguard Worker 	memset(base, 0, sizeof(*base));
388*663afb9bSAndroid Build Coastguard Worker 	/* OSX has mach_absolute_time() */
389*663afb9bSAndroid Build Coastguard Worker 	if (!fallback &&
390*663afb9bSAndroid Build Coastguard Worker 	    mach_timebase_info(&mi) == 0 &&
391*663afb9bSAndroid Build Coastguard Worker 	    mach_absolute_time() != 0) {
392*663afb9bSAndroid Build Coastguard Worker 		/* mach_timebase_info tells us how to convert
393*663afb9bSAndroid Build Coastguard Worker 		 * mach_absolute_time() into nanoseconds, but we
394*663afb9bSAndroid Build Coastguard Worker 		 * want to use microseconds instead. */
395*663afb9bSAndroid Build Coastguard Worker 		mi.denom *= 1000;
396*663afb9bSAndroid Build Coastguard Worker 		memcpy(&base->mach_timebase_units, &mi, sizeof(mi));
397*663afb9bSAndroid Build Coastguard Worker 	} else {
398*663afb9bSAndroid Build Coastguard Worker 		base->mach_timebase_units.numer = 0;
399*663afb9bSAndroid Build Coastguard Worker 	}
400*663afb9bSAndroid Build Coastguard Worker 	return 0;
401*663afb9bSAndroid Build Coastguard Worker }
402*663afb9bSAndroid Build Coastguard Worker 
403*663afb9bSAndroid Build Coastguard Worker int
evutil_gettime_monotonic_(struct evutil_monotonic_timer * base,struct timeval * tp)404*663afb9bSAndroid Build Coastguard Worker evutil_gettime_monotonic_(struct evutil_monotonic_timer *base,
405*663afb9bSAndroid Build Coastguard Worker     struct timeval *tp)
406*663afb9bSAndroid Build Coastguard Worker {
407*663afb9bSAndroid Build Coastguard Worker 	ev_uint64_t abstime, usec;
408*663afb9bSAndroid Build Coastguard Worker 	if (base->mach_timebase_units.numer == 0) {
409*663afb9bSAndroid Build Coastguard Worker 		if (evutil_gettimeofday(tp, NULL) < 0)
410*663afb9bSAndroid Build Coastguard Worker 			return -1;
411*663afb9bSAndroid Build Coastguard Worker 		adjust_monotonic_time(base, tp);
412*663afb9bSAndroid Build Coastguard Worker 		return 0;
413*663afb9bSAndroid Build Coastguard Worker 	}
414*663afb9bSAndroid Build Coastguard Worker 
415*663afb9bSAndroid Build Coastguard Worker 	abstime = mach_absolute_time();
416*663afb9bSAndroid Build Coastguard Worker 	usec = (abstime * base->mach_timebase_units.numer)
417*663afb9bSAndroid Build Coastguard Worker 	    / (base->mach_timebase_units.denom);
418*663afb9bSAndroid Build Coastguard Worker 	tp->tv_sec = usec / 1000000;
419*663afb9bSAndroid Build Coastguard Worker 	tp->tv_usec = usec % 1000000;
420*663afb9bSAndroid Build Coastguard Worker 
421*663afb9bSAndroid Build Coastguard Worker 	return 0;
422*663afb9bSAndroid Build Coastguard Worker }
423*663afb9bSAndroid Build Coastguard Worker #endif
424*663afb9bSAndroid Build Coastguard Worker 
425*663afb9bSAndroid Build Coastguard Worker #if defined(HAVE_WIN32_MONOTONIC)
426*663afb9bSAndroid Build Coastguard Worker /* =====
427*663afb9bSAndroid Build Coastguard Worker    Turn we now to Windows.  Want monontonic time on Windows?
428*663afb9bSAndroid Build Coastguard Worker 
429*663afb9bSAndroid Build Coastguard Worker    Windows has QueryPerformanceCounter(), which gives time most high-
430*663afb9bSAndroid Build Coastguard Worker    resolution time.  It's a pity it's not so monotonic in practice; it's
431*663afb9bSAndroid Build Coastguard Worker    also got some fun bugs, especially: with older Windowses, under
432*663afb9bSAndroid Build Coastguard Worker    virtualizations, with funny hardware, on multiprocessor systems, and so
433*663afb9bSAndroid Build Coastguard Worker    on.  PEP418 [1] has a nice roundup of the issues here.
434*663afb9bSAndroid Build Coastguard Worker 
435*663afb9bSAndroid Build Coastguard Worker    There's GetTickCount64() on Vista and later, which gives a number of 1-msec
436*663afb9bSAndroid Build Coastguard Worker    ticks since startup.  The accuracy here might be as bad as 10-20 msec, I
437*663afb9bSAndroid Build Coastguard Worker    hear.  There's an undocumented function (NtSetTimerResolution) that
438*663afb9bSAndroid Build Coastguard Worker    allegedly increases the accuracy. Good luck!
439*663afb9bSAndroid Build Coastguard Worker 
440*663afb9bSAndroid Build Coastguard Worker    There's also GetTickCount(), which is only 32 bits, but seems to be
441*663afb9bSAndroid Build Coastguard Worker    supported on pre-Vista versions of Windows.  Apparently, you can coax
442*663afb9bSAndroid Build Coastguard Worker    another 14 bits out of it, giving you 2231 years before rollover.
443*663afb9bSAndroid Build Coastguard Worker 
444*663afb9bSAndroid Build Coastguard Worker    The less said about timeGetTime() the better.
445*663afb9bSAndroid Build Coastguard Worker 
446*663afb9bSAndroid Build Coastguard Worker    "We don't care.  We don't have to.  We're the Phone Company."
447*663afb9bSAndroid Build Coastguard Worker             -- Lily Tomlin, SNL
448*663afb9bSAndroid Build Coastguard Worker 
449*663afb9bSAndroid Build Coastguard Worker    Our strategy, if precise timers are turned off, is to just use the best
450*663afb9bSAndroid Build Coastguard Worker    GetTickCount equivalent available.  If we've been asked for precise timing,
451*663afb9bSAndroid Build Coastguard Worker    then we mostly[2] assume that GetTickCount is monotonic, and correct
452*663afb9bSAndroid Build Coastguard Worker    GetPerformanceCounter to approximate it.
453*663afb9bSAndroid Build Coastguard Worker 
454*663afb9bSAndroid Build Coastguard Worker    [1] http://www.python.org/dev/peps/pep-0418
455*663afb9bSAndroid Build Coastguard Worker    [2] Of course, we feed the Windows stuff into adjust_monotonic_time()
456*663afb9bSAndroid Build Coastguard Worker        anyway, just in case it isn't.
457*663afb9bSAndroid Build Coastguard Worker 
458*663afb9bSAndroid Build Coastguard Worker  */
459*663afb9bSAndroid Build Coastguard Worker /*
460*663afb9bSAndroid Build Coastguard Worker     Parts of our logic in the win32 timer code here are closely based on
461*663afb9bSAndroid Build Coastguard Worker     BitTorrent's libUTP library.  That code is subject to the following
462*663afb9bSAndroid Build Coastguard Worker     license:
463*663afb9bSAndroid Build Coastguard Worker 
464*663afb9bSAndroid Build Coastguard Worker       Copyright (c) 2010 BitTorrent, Inc.
465*663afb9bSAndroid Build Coastguard Worker 
466*663afb9bSAndroid Build Coastguard Worker       Permission is hereby granted, free of charge, to any person obtaining a
467*663afb9bSAndroid Build Coastguard Worker       copy of this software and associated documentation files (the
468*663afb9bSAndroid Build Coastguard Worker       "Software"), to deal in the Software without restriction, including
469*663afb9bSAndroid Build Coastguard Worker       without limitation the rights to use, copy, modify, merge, publish,
470*663afb9bSAndroid Build Coastguard Worker       distribute, sublicense, and/or sell copies of the Software, and to
471*663afb9bSAndroid Build Coastguard Worker       permit persons to whom the Software is furnished to do so, subject to
472*663afb9bSAndroid Build Coastguard Worker       the following conditions:
473*663afb9bSAndroid Build Coastguard Worker 
474*663afb9bSAndroid Build Coastguard Worker       The above copyright notice and this permission notice shall be included
475*663afb9bSAndroid Build Coastguard Worker       in all copies or substantial portions of the Software.
476*663afb9bSAndroid Build Coastguard Worker 
477*663afb9bSAndroid Build Coastguard Worker       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
478*663afb9bSAndroid Build Coastguard Worker       OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
479*663afb9bSAndroid Build Coastguard Worker       MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
480*663afb9bSAndroid Build Coastguard Worker       NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
481*663afb9bSAndroid Build Coastguard Worker       LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
482*663afb9bSAndroid Build Coastguard Worker       OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
483*663afb9bSAndroid Build Coastguard Worker       WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
484*663afb9bSAndroid Build Coastguard Worker */
485*663afb9bSAndroid Build Coastguard Worker 
486*663afb9bSAndroid Build Coastguard Worker static ev_uint64_t
evutil_GetTickCount_(struct evutil_monotonic_timer * base)487*663afb9bSAndroid Build Coastguard Worker evutil_GetTickCount_(struct evutil_monotonic_timer *base)
488*663afb9bSAndroid Build Coastguard Worker {
489*663afb9bSAndroid Build Coastguard Worker 	if (base->GetTickCount64_fn) {
490*663afb9bSAndroid Build Coastguard Worker 		/* Let's just use GetTickCount64 if we can. */
491*663afb9bSAndroid Build Coastguard Worker 		return base->GetTickCount64_fn();
492*663afb9bSAndroid Build Coastguard Worker 	} else if (base->GetTickCount_fn) {
493*663afb9bSAndroid Build Coastguard Worker 		/* Greg Hazel assures me that this works, that BitTorrent has
494*663afb9bSAndroid Build Coastguard Worker 		 * done it for years, and this it won't turn around and
495*663afb9bSAndroid Build Coastguard Worker 		 * bite us.  He says they found it on some game programmers'
496*663afb9bSAndroid Build Coastguard Worker 		 * forum some time around 2007.
497*663afb9bSAndroid Build Coastguard Worker 		 */
498*663afb9bSAndroid Build Coastguard Worker 		ev_uint64_t v = base->GetTickCount_fn();
499*663afb9bSAndroid Build Coastguard Worker 		return (DWORD)v | ((v >> 18) & 0xFFFFFFFF00000000);
500*663afb9bSAndroid Build Coastguard Worker 	} else {
501*663afb9bSAndroid Build Coastguard Worker 		/* Here's the fallback implementation. We have to use
502*663afb9bSAndroid Build Coastguard Worker 		 * GetTickCount() with its given signature, so we only get
503*663afb9bSAndroid Build Coastguard Worker 		 * 32 bits worth of milliseconds, which will roll ove every
504*663afb9bSAndroid Build Coastguard Worker 		 * 49 days or so.  */
505*663afb9bSAndroid Build Coastguard Worker 		DWORD ticks = GetTickCount();
506*663afb9bSAndroid Build Coastguard Worker 		if (ticks < base->last_tick_count) {
507*663afb9bSAndroid Build Coastguard Worker 			base->adjust_tick_count += ((ev_uint64_t)1) << 32;
508*663afb9bSAndroid Build Coastguard Worker 		}
509*663afb9bSAndroid Build Coastguard Worker 		base->last_tick_count = ticks;
510*663afb9bSAndroid Build Coastguard Worker 		return ticks + base->adjust_tick_count;
511*663afb9bSAndroid Build Coastguard Worker 	}
512*663afb9bSAndroid Build Coastguard Worker }
513*663afb9bSAndroid Build Coastguard Worker 
514*663afb9bSAndroid Build Coastguard Worker int
evutil_configure_monotonic_time_(struct evutil_monotonic_timer * base,int flags)515*663afb9bSAndroid Build Coastguard Worker evutil_configure_monotonic_time_(struct evutil_monotonic_timer *base,
516*663afb9bSAndroid Build Coastguard Worker     int flags)
517*663afb9bSAndroid Build Coastguard Worker {
518*663afb9bSAndroid Build Coastguard Worker 	const int precise = flags & EV_MONOT_PRECISE;
519*663afb9bSAndroid Build Coastguard Worker 	const int fallback = flags & EV_MONOT_FALLBACK;
520*663afb9bSAndroid Build Coastguard Worker 	HANDLE h;
521*663afb9bSAndroid Build Coastguard Worker 	memset(base, 0, sizeof(*base));
522*663afb9bSAndroid Build Coastguard Worker 
523*663afb9bSAndroid Build Coastguard Worker 	h = evutil_load_windows_system_library_(TEXT("kernel32.dll"));
524*663afb9bSAndroid Build Coastguard Worker 	if (h != NULL && !fallback) {
525*663afb9bSAndroid Build Coastguard Worker 		base->GetTickCount64_fn = (ev_GetTickCount_func)GetProcAddress(h, "GetTickCount64");
526*663afb9bSAndroid Build Coastguard Worker 		base->GetTickCount_fn = (ev_GetTickCount_func)GetProcAddress(h, "GetTickCount");
527*663afb9bSAndroid Build Coastguard Worker 	}
528*663afb9bSAndroid Build Coastguard Worker 
529*663afb9bSAndroid Build Coastguard Worker 	base->first_tick = base->last_tick_count = evutil_GetTickCount_(base);
530*663afb9bSAndroid Build Coastguard Worker 	if (precise && !fallback) {
531*663afb9bSAndroid Build Coastguard Worker 		LARGE_INTEGER freq;
532*663afb9bSAndroid Build Coastguard Worker 		if (QueryPerformanceFrequency(&freq)) {
533*663afb9bSAndroid Build Coastguard Worker 			LARGE_INTEGER counter;
534*663afb9bSAndroid Build Coastguard Worker 			QueryPerformanceCounter(&counter);
535*663afb9bSAndroid Build Coastguard Worker 			base->first_counter = counter.QuadPart;
536*663afb9bSAndroid Build Coastguard Worker 			base->usec_per_count = 1.0e6 / freq.QuadPart;
537*663afb9bSAndroid Build Coastguard Worker 			base->use_performance_counter = 1;
538*663afb9bSAndroid Build Coastguard Worker 		}
539*663afb9bSAndroid Build Coastguard Worker 	}
540*663afb9bSAndroid Build Coastguard Worker 
541*663afb9bSAndroid Build Coastguard Worker 	return 0;
542*663afb9bSAndroid Build Coastguard Worker }
543*663afb9bSAndroid Build Coastguard Worker 
544*663afb9bSAndroid Build Coastguard Worker static inline ev_int64_t
abs64(ev_int64_t i)545*663afb9bSAndroid Build Coastguard Worker abs64(ev_int64_t i)
546*663afb9bSAndroid Build Coastguard Worker {
547*663afb9bSAndroid Build Coastguard Worker 	return i < 0 ? -i : i;
548*663afb9bSAndroid Build Coastguard Worker }
549*663afb9bSAndroid Build Coastguard Worker 
550*663afb9bSAndroid Build Coastguard Worker 
551*663afb9bSAndroid Build Coastguard Worker int
evutil_gettime_monotonic_(struct evutil_monotonic_timer * base,struct timeval * tp)552*663afb9bSAndroid Build Coastguard Worker evutil_gettime_monotonic_(struct evutil_monotonic_timer *base,
553*663afb9bSAndroid Build Coastguard Worker     struct timeval *tp)
554*663afb9bSAndroid Build Coastguard Worker {
555*663afb9bSAndroid Build Coastguard Worker 	ev_uint64_t ticks = evutil_GetTickCount_(base);
556*663afb9bSAndroid Build Coastguard Worker 	if (base->use_performance_counter) {
557*663afb9bSAndroid Build Coastguard Worker 		/* Here's a trick we took from BitTorrent's libutp, at Greg
558*663afb9bSAndroid Build Coastguard Worker 		 * Hazel's recommendation.  We use QueryPerformanceCounter for
559*663afb9bSAndroid Build Coastguard Worker 		 * our high-resolution timer, but use GetTickCount*() to keep
560*663afb9bSAndroid Build Coastguard Worker 		 * it sane, and adjust_monotonic_time() to keep it monotonic.
561*663afb9bSAndroid Build Coastguard Worker 		 */
562*663afb9bSAndroid Build Coastguard Worker 		LARGE_INTEGER counter;
563*663afb9bSAndroid Build Coastguard Worker 		ev_int64_t counter_elapsed, counter_usec_elapsed, ticks_elapsed;
564*663afb9bSAndroid Build Coastguard Worker 		QueryPerformanceCounter(&counter);
565*663afb9bSAndroid Build Coastguard Worker 		counter_elapsed = (ev_int64_t)
566*663afb9bSAndroid Build Coastguard Worker 		    (counter.QuadPart - base->first_counter);
567*663afb9bSAndroid Build Coastguard Worker 		ticks_elapsed = ticks - base->first_tick;
568*663afb9bSAndroid Build Coastguard Worker 		/* TODO: This may upset VC6. If you need this to work with
569*663afb9bSAndroid Build Coastguard Worker 		 * VC6, please supply an appropriate patch. */
570*663afb9bSAndroid Build Coastguard Worker 		counter_usec_elapsed = (ev_int64_t)
571*663afb9bSAndroid Build Coastguard Worker 		    (counter_elapsed * base->usec_per_count);
572*663afb9bSAndroid Build Coastguard Worker 
573*663afb9bSAndroid Build Coastguard Worker 		if (abs64(ticks_elapsed*1000 - counter_usec_elapsed) > 1000000) {
574*663afb9bSAndroid Build Coastguard Worker 			/* It appears that the QueryPerformanceCounter()
575*663afb9bSAndroid Build Coastguard Worker 			 * result is more than 1 second away from
576*663afb9bSAndroid Build Coastguard Worker 			 * GetTickCount() result. Let's adjust it to be as
577*663afb9bSAndroid Build Coastguard Worker 			 * accurate as we can; adjust_monotnonic_time() below
578*663afb9bSAndroid Build Coastguard Worker 			 * will keep it monotonic. */
579*663afb9bSAndroid Build Coastguard Worker 			counter_usec_elapsed = ticks_elapsed * 1000;
580*663afb9bSAndroid Build Coastguard Worker 			base->first_counter = (ev_uint64_t) (counter.QuadPart - counter_usec_elapsed / base->usec_per_count);
581*663afb9bSAndroid Build Coastguard Worker 		}
582*663afb9bSAndroid Build Coastguard Worker 		tp->tv_sec = (time_t) (counter_usec_elapsed / 1000000);
583*663afb9bSAndroid Build Coastguard Worker 		tp->tv_usec = counter_usec_elapsed % 1000000;
584*663afb9bSAndroid Build Coastguard Worker 
585*663afb9bSAndroid Build Coastguard Worker 	} else {
586*663afb9bSAndroid Build Coastguard Worker 		/* We're just using GetTickCount(). */
587*663afb9bSAndroid Build Coastguard Worker 		tp->tv_sec = (time_t) (ticks / 1000);
588*663afb9bSAndroid Build Coastguard Worker 		tp->tv_usec = (ticks % 1000) * 1000;
589*663afb9bSAndroid Build Coastguard Worker 	}
590*663afb9bSAndroid Build Coastguard Worker 	adjust_monotonic_time(base, tp);
591*663afb9bSAndroid Build Coastguard Worker 
592*663afb9bSAndroid Build Coastguard Worker 	return 0;
593*663afb9bSAndroid Build Coastguard Worker }
594*663afb9bSAndroid Build Coastguard Worker #endif
595*663afb9bSAndroid Build Coastguard Worker 
596*663afb9bSAndroid Build Coastguard Worker #if defined(HAVE_FALLBACK_MONOTONIC)
597*663afb9bSAndroid Build Coastguard Worker /* =====
598*663afb9bSAndroid Build Coastguard Worker    And if none of the other options work, let's just use gettimeofday(), and
599*663afb9bSAndroid Build Coastguard Worker    ratchet it forward so that it acts like a monotonic timer, whether it
600*663afb9bSAndroid Build Coastguard Worker    wants to or not.
601*663afb9bSAndroid Build Coastguard Worker  */
602*663afb9bSAndroid Build Coastguard Worker 
603*663afb9bSAndroid Build Coastguard Worker int
evutil_configure_monotonic_time_(struct evutil_monotonic_timer * base,int precise)604*663afb9bSAndroid Build Coastguard Worker evutil_configure_monotonic_time_(struct evutil_monotonic_timer *base,
605*663afb9bSAndroid Build Coastguard Worker     int precise)
606*663afb9bSAndroid Build Coastguard Worker {
607*663afb9bSAndroid Build Coastguard Worker 	memset(base, 0, sizeof(*base));
608*663afb9bSAndroid Build Coastguard Worker 	return 0;
609*663afb9bSAndroid Build Coastguard Worker }
610*663afb9bSAndroid Build Coastguard Worker 
611*663afb9bSAndroid Build Coastguard Worker int
evutil_gettime_monotonic_(struct evutil_monotonic_timer * base,struct timeval * tp)612*663afb9bSAndroid Build Coastguard Worker evutil_gettime_monotonic_(struct evutil_monotonic_timer *base,
613*663afb9bSAndroid Build Coastguard Worker     struct timeval *tp)
614*663afb9bSAndroid Build Coastguard Worker {
615*663afb9bSAndroid Build Coastguard Worker 	if (evutil_gettimeofday(tp, NULL) < 0)
616*663afb9bSAndroid Build Coastguard Worker 		return -1;
617*663afb9bSAndroid Build Coastguard Worker 	adjust_monotonic_time(base, tp);
618*663afb9bSAndroid Build Coastguard Worker 	return 0;
619*663afb9bSAndroid Build Coastguard Worker 
620*663afb9bSAndroid Build Coastguard Worker }
621*663afb9bSAndroid Build Coastguard Worker #endif
622