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