Till now, we were initializing 'unix_epoch' through time_init(). But if there was a call directly to xgettimeofday(), we would miss the initialization causing overflows. This would cause 'ovs-ofctl benchmark' to produce wrong results.
This commit fixes it by having a separate initialization function for 'unix_epoch' and calling it from functions that actually use it. Reported-by: Alessandro Pilotti <apilo...@cloudbasesolutions.com> Reported-by: Linda Sun <l...@vmware.com> Signed-off-by: Gurucharan Shetty <gshe...@nicira.com> --- AUTHORS | 1 + lib/timeval.c | 33 +++++++++++++++++++++++---------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/AUTHORS b/AUTHORS index 64ede54..17a85d0 100644 --- a/AUTHORS +++ b/AUTHORS @@ -150,6 +150,7 @@ Ahmed Bilal numan...@gmail.com Alan Shieh ash...@nicira.com Alban Browaeys pra...@yahoo.com Alex Yip a...@nicira.com +Alessandro Pilotti apilo...@cloudbasesolutions.com Alexey I. Froloff ra...@altlinux.org Amar Padmanabhan a...@nicira.com Amey Bhide abh...@nicira.com diff --git a/lib/timeval.c b/lib/timeval.c index fec3cfa..25e903e 100644 --- a/lib/timeval.c +++ b/lib/timeval.c @@ -123,16 +123,6 @@ do_init_time(void) { struct timespec ts; -#ifdef _WIN32 - /* Calculate number of 100-nanosecond intervals till 01/01/1970. */ - SYSTEMTIME unix_epoch_st = { 1970, 1, 0, 1, 0, 0, 0, 0}; - FILETIME unix_epoch_ft; - - SystemTimeToFileTime(&unix_epoch_st, &unix_epoch_ft); - unix_epoch.LowPart = unix_epoch_ft.dwLowDateTime; - unix_epoch.HighPart = unix_epoch_ft.dwHighDateTime; -#endif - coverage_init(); init_clock(&monotonic_clock, (!clock_gettime(CLOCK_MONOTONIC, &ts) @@ -377,6 +367,25 @@ time_boot_msec(void) } #ifdef _WIN32 +static void +time_unix_epoch__(void) +{ + /* Calculate number of 100-nanosecond intervals till 01/01/1970. */ + SYSTEMTIME unix_epoch_st = { 1970, 1, 0, 1, 0, 0, 0, 0}; + FILETIME unix_epoch_ft; + + SystemTimeToFileTime(&unix_epoch_st, &unix_epoch_ft); + unix_epoch.LowPart = unix_epoch_ft.dwLowDateTime; + unix_epoch.HighPart = unix_epoch_ft.dwHighDateTime; +} + +static void +time_unix_epoch(void) +{ + static pthread_once_t once = PTHREAD_ONCE_INIT; + pthread_once(&once, time_unix_epoch__); +} + static ULARGE_INTEGER xgetfiletime(void) { @@ -415,6 +424,8 @@ clock_gettime(clock_t id, struct timespec *ts) } else if (id == CLOCK_REALTIME) { ULARGE_INTEGER current_time = xgetfiletime(); + time_unix_epoch(); + /* Time from Epoch to now. */ ts->tv_sec = (current_time.QuadPart - unix_epoch.QuadPart) / 10000000; ts->tv_nsec = ((current_time.QuadPart - unix_epoch.QuadPart) % @@ -435,6 +446,8 @@ xgettimeofday(struct timeval *tv) #else ULARGE_INTEGER current_time = xgetfiletime(); + time_unix_epoch(); + tv->tv_sec = (current_time.QuadPart - unix_epoch.QuadPart) / 10000000; tv->tv_usec = ((current_time.QuadPart - unix_epoch.QuadPart) % 10000000) / 10; -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev