mirror of https://github.com/c-ares/c-ares.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.0 KiB
112 lines
3.0 KiB
/* $Id$ */ |
|
|
|
/* Copyright (C) 2008 by Daniel Stenberg et al |
|
* |
|
* Permission to use, copy, modify, and distribute this software and its |
|
* documentation for any purpose and without fee is hereby granted, provided |
|
* that the above copyright notice appear in all copies and that both that |
|
* copyright notice and this permission notice appear in supporting |
|
* documentation, and that the name of M.I.T. not be used in advertising or |
|
* publicity pertaining to distribution of the software without specific, |
|
* written prior permission. M.I.T. makes no representations about the |
|
* suitability of this software for any purpose. It is provided "as is" |
|
* without express or implied warranty. |
|
*/ |
|
|
|
#include "setup.h" |
|
#include "ares.h" |
|
#include "ares_private.h" |
|
|
|
#if defined(WIN32) && !defined(MSDOS) |
|
|
|
struct timeval ares__tvnow(void) |
|
{ |
|
/* |
|
** GetTickCount() is available on _all_ Windows versions from W95 up |
|
** to nowadays. Returns milliseconds elapsed since last system boot, |
|
** increases monotonically and wraps once 49.7 days have elapsed. |
|
*/ |
|
struct timeval now; |
|
DWORD milliseconds = GetTickCount(); |
|
now.tv_sec = milliseconds / 1000; |
|
now.tv_usec = (milliseconds % 1000) * 1000; |
|
return now; |
|
} |
|
|
|
#elif defined(HAVE_CLOCK_GETTIME_MONOTONIC) |
|
|
|
struct timeval ares__tvnow(void) |
|
{ |
|
/* |
|
** clock_gettime() is granted to be increased monotonically when the |
|
** monotonic clock is queried. Time starting point is unspecified, it |
|
** could be the system start-up time, the Epoch, or something else, |
|
** in any case the time starting point does not change once that the |
|
** system has started up. |
|
*/ |
|
struct timeval now; |
|
struct timespec tsnow; |
|
if(0 == clock_gettime(CLOCK_MONOTONIC, &tsnow)) { |
|
now.tv_sec = tsnow.tv_sec; |
|
now.tv_usec = tsnow.tv_nsec / 1000; |
|
} |
|
/* |
|
** Even when the configure process has truly detected monotonic clock |
|
** availability, it might happen that it is not actually available at |
|
** run-time. When this occurs simply fallback to other time source. |
|
*/ |
|
#ifdef HAVE_GETTIMEOFDAY |
|
else |
|
(void)gettimeofday(&now, NULL); |
|
#else |
|
else { |
|
now.tv_sec = (long)time(NULL); |
|
now.tv_usec = 0; |
|
} |
|
#endif |
|
return now; |
|
} |
|
|
|
#elif defined(HAVE_GETTIMEOFDAY) |
|
|
|
struct timeval ares__tvnow(void) |
|
{ |
|
/* |
|
** gettimeofday() is not granted to be increased monotonically, due to |
|
** clock drifting and external source time synchronization it can jump |
|
** forward or backward in time. |
|
*/ |
|
struct timeval now; |
|
(void)gettimeofday(&now, NULL); |
|
return now; |
|
} |
|
|
|
#else |
|
|
|
struct timeval ares__tvnow(void) |
|
{ |
|
/* |
|
** time() returns the value of time in seconds since the Epoch. |
|
*/ |
|
struct timeval now; |
|
now.tv_sec = (long)time(NULL); |
|
now.tv_usec = 0; |
|
return now; |
|
} |
|
|
|
#endif |
|
|
|
#if 0 /* Not used */ |
|
/* |
|
* Make sure that the first argument is the more recent time, as otherwise |
|
* we'll get a weird negative time-diff back... |
|
* |
|
* Returns: the time difference in number of milliseconds. |
|
*/ |
|
long ares__tvdiff(struct timeval newer, struct timeval older) |
|
{ |
|
return (newer.tv_sec-older.tv_sec)*1000+ |
|
(newer.tv_usec-older.tv_usec)/1000; |
|
} |
|
#endif |
|
|
|
|