[zeromq-dev] [PATCH] Use monotonic clock for clock_t

Martin Sustrik sustrik at 250bpm.com
Sat Dec 3 04:54:16 CET 2011


Hi Mika,

I've applied the patch locally and for some reason configure doesn't 
detect the fact that clock_gettime is available on my system.

   checking for clock_gettime... no

Any ideas what the problem may be?

Martin

On 02/12/11 20:56, Mika Fischer wrote:
> This makes clock_t insensitive to the system clock being reset by NTP or
> the sysadmin, which could previously cause long hangs for instance in
> zmq_poll.
>
> Signed-off-by: Mika Fischer<mika.fischer at zoopnet.de>
> ---
>   configure.in  |    4 ++--
>   src/clock.cpp |   12 ++++++++++++
>   2 files changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/configure.in b/configure.in
> index fbd0876..bdff0cf 100644
> --- a/configure.in
> +++ b/configure.in
> @@ -254,7 +254,7 @@ LIBZMQ_CHECK_DOC_BUILD
>   # Checks for header files.
>   AC_HEADER_STDC
>   AC_CHECK_HEADERS(errno.h arpa/inet.h netinet/tcp.h netinet/in.h stddef.h \
> -stdlib.h string.h sys/socket.h sys/time.h unistd.h limits.h)
> +stdlib.h string.h sys/socket.h sys/time.h time.h unistd.h limits.h)
>
>   # Check if we have ifaddrs.h header file.
>   AC_CHECK_HEADERS(ifaddrs.h, [AC_DEFINE(ZMQ_HAVE_IFADDRS, 1, [Have ifaddrs.h header.])])
> @@ -376,7 +376,7 @@ AM_CONDITIONAL(ON_MINGW, test "x$libzmq_on_mingw32" = "xyes")
>
>   # Checks for library functions.
>   AC_TYPE_SIGNAL
> -AC_CHECK_FUNCS(perror gettimeofday memset socket getifaddrs freeifaddrs)
> +AC_CHECK_FUNCS(perror gettimeofday clock_gettime memset socket getifaddrs freeifaddrs)
>   AC_CHECK_HEADERS([alloca.h])
>   LIBZMQ_CHECK_SOCK_CLOEXEC([AC_DEFINE(
>                                 [HAVE_SOCK_CLOEXEC],
> diff --git a/src/clock.cpp b/src/clock.cpp
> index f98a2f4..f1da091 100644
> --- a/src/clock.cpp
> +++ b/src/clock.cpp
> @@ -34,6 +34,10 @@
>   #include<sys/time.h>
>   #endif
>
> +#if defined HAVE_CLOCK_GETTIME
> +#include<time.h>
> +#endif
> +
>   zmq::clock_t::clock_t () :
>       last_tsc (rdtsc ()),
>       last_time (now_us () / 1000)
> @@ -61,6 +65,14 @@ uint64_t zmq::clock_t::now_us ()
>       double ticks_div = (double) (ticksPerSecond.QuadPart / 1000000);
>       return (uint64_t) (tick.QuadPart / ticks_div);
>
> +#elif defined HAVE_CLOCK_GETTIME
> +
> +    //  Use POSIX clock_gettime function to get precise monotonic time.
> +    struct timespec tv;
> +    int rc = clock_gettime (CLOCK_MONOTONIC,&tv);
> +    errno_assert (rc == 0);
> +    return (tv.tv_sec * (uint64_t) 1000000 + tv.tv_nsec / 1000);
> +
>   #else
>
>       //  Use POSIX gettimeofday function to get precise time.




More information about the zeromq-dev mailing list