GetTimeInMillis: Use CLOCK_MONOTONIC_COARSE where available
On some systems, using CLOCK_MONOTONIC forces a readback of HPET or some similarly expensive timer. CLOCK_MONOTONIC_COARSE can alleviate this, at the cost of negligibly-reduced resolution, so prefer that where we can. Signed-off-by: Daniel Stone <daniel@fooishbar.org> Reviewed-by: Julien Cristau <jcristau@debian.org> Reviewed-by: Tiago Vignatti <tiago.vignatti@nokia.com>
This commit is contained in:
parent
e06fa80400
commit
44adb31bfe
16
os/utils.c
16
os/utils.c
|
@ -427,7 +427,21 @@ GetTimeInMillis(void)
|
|||
|
||||
#ifdef MONOTONIC_CLOCK
|
||||
struct timespec tp;
|
||||
if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
|
||||
static clockid_t clockid;
|
||||
if (!clockid) {
|
||||
#ifdef CLOCK_MONOTONIC_COARSE
|
||||
if (clock_getres(CLOCK_MONOTONIC_COARSE, &tp) == 0 &&
|
||||
(tp.tv_nsec / 1000) <= 1000 &&
|
||||
clock_gettime(CLOCK_MONOTONIC_COARSE, &tp) == 0)
|
||||
clockid = CLOCK_MONOTONIC_COARSE;
|
||||
else
|
||||
#endif
|
||||
if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
|
||||
clockid = CLOCK_MONOTONIC;
|
||||
else
|
||||
clockid = ~0L;
|
||||
}
|
||||
if (clockid != ~0L && clock_gettime(clockid, &tp) == 0)
|
||||
return (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000L);
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user