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