The recently added unit test that checks the consistency between time(NULL) and gettimeofday() fails on native Windows. Both on mingw (which has a gettimeofday function) and on MSVC (which does not have gettimeofday and therefore uses gnulib's replacement).
Here, after gettimeofday() reports a new second, it takes about 5 msec until time(NULL) reports that new second as well. This patch fixes it, by implementing time(NULL) based on gettimeofday(). Note that the mingw gettimeofday() and the gnulib replacement are equivalent. 2023-03-17 Bruno Haible <br...@clisp.org> time: Fix test failure on native Windows. * m4/time.m4 (gl_FUNC_TIME): Guess that it does not work on native Windows. * modules/time (Depends-on): Add gettimeofday. * doc/posix-functions/time.texi: Mention the bug on Windows. diff --git a/doc/posix-functions/time.texi b/doc/posix-functions/time.texi index a8e9abcddf..5d7c719594 100644 --- a/doc/posix-functions/time.texi +++ b/doc/posix-functions/time.texi @@ -12,10 +12,11 @@ This function is not consistent with @code{gettimeofday} and @code{timespec_get} on some platforms: @c https://sourceware.org/bugzilla/show_bug.cgi?id=30200 -glibc 2.31 or newer on Linux. -Namely, in the first 1 to 2.5 milliseconds of every second, @code{time} -returns a value that is one less than the @code{tv_sec} part of the return -value of @code{gettimeofday} or @code{timespec_get}. +glibc 2.31 or newer on Linux, native Windows. +Namely, in the first 1 to 2.5 milliseconds of every second (or, on Windows, +in the first 5 milliseconds of every second), @code{time} returns a value +that is one less than the @code{tv_sec} part of the return value of +@code{gettimeofday} or @code{timespec_get}. @end itemize Portability problems not fixed by Gnulib: diff --git a/m4/time.m4 b/m4/time.m4 index 0dbb6011ed..504ec77f88 100644 --- a/m4/time.m4 +++ b/m4/time.m4 @@ -1,4 +1,4 @@ -# time.m4 serial 1 +# time.m4 serial 2 dnl Copyright (C) 2023 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -12,9 +12,11 @@ AC_DEFUN([gl_FUNC_TIME] dnl glibc has the bug https://sourceware.org/bugzilla/show_bug.cgi?id=30200 . AC_CACHE_CHECK([whether time() works], [gl_cv_func_time_works], - [dnl Guess that it works except on glibc >= 2.31 with Linux. - dnl And binaries produced on glibc < 2.31 need to run fine on newer - dnl glibc versions as well; therefore ignore __GLIBC_MINOR__. + [dnl Guess that it works except on + dnl - glibc >= 2.31 with Linux. And binaries produced on glibc < 2.31 + dnl need to run fine on newer glibc versions as well; therefore ignore + dnl __GLIBC_MINOR__. + dnl - native Windows. case "$host_os" in linux*-gnu*) AC_EGREP_CPP([Unlucky], [ @@ -28,6 +30,7 @@ AC_DEFUN([gl_FUNC_TIME] [gl_cv_func_time_works="guessing no"], [gl_cv_func_time_works="guessing yes"]) ;; + mingw*) gl_cv_func_time_works="guessing no";; *) gl_cv_func_time_works="guessing yes";; esac ]) diff --git a/modules/time b/modules/time index 45f5ffd35f..2729ad06ea 100644 --- a/modules/time +++ b/modules/time @@ -7,6 +7,7 @@ m4/time.m4 Depends-on: time-h +gettimeofday [test $REPLACE_TIME = 1] configure.ac: gl_FUNC_TIME