From 2bfe24bdd9ce313e5323d947952067b1475dd2cc Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Mon, 21 May 2007 14:27:32 +0200 Subject: [PATCH] Attempt to work-around possible time warp A theory - we see gettimeofday() going backwards on some systems, try and correct for that by just returning 0 for time passed. Signed-off-by: Jens Axboe --- time.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/time.c b/time.c index c6a62878..4fbc98bb 100644 --- a/time.c +++ b/time.c @@ -8,7 +8,7 @@ static unsigned long ns_granularity; unsigned long utime_since(struct timeval *s, struct timeval *e) { - long sec, usec; + long sec, usec, ret; sec = e->tv_sec - s->tv_sec; usec = e->tv_usec - s->tv_usec; @@ -18,8 +18,15 @@ unsigned long utime_since(struct timeval *s, struct timeval *e) } sec *= 1000000UL; + ret = sec + usec; - return sec + usec; + /* + * time warp bug on some kernels? + */ + if (ret < 0) + ret = 0; + + return ret; } unsigned long utime_since_now(struct timeval *s) @@ -32,7 +39,7 @@ unsigned long utime_since_now(struct timeval *s) unsigned long mtime_since(struct timeval *s, struct timeval *e) { - long sec, usec; + long sec, usec, ret; sec = e->tv_sec - s->tv_sec; usec = e->tv_usec - s->tv_usec; @@ -43,8 +50,15 @@ unsigned long mtime_since(struct timeval *s, struct timeval *e) sec *= 1000UL; usec /= 1000UL; + ret = sec + usec; + + /* + * time warp bug on some kernels? + */ + if (ret < 0) + ret = 0; - return sec + usec; + return ret; } unsigned long mtime_since_now(struct timeval *s) -- 2.25.1