From 582bf347c9939c1648be9edc9e229f5d30e2f07c Mon Sep 17 00:00:00 2001 From: Quentin Smith Date: Sun, 26 Feb 2012 00:29:29 -0500 Subject: [PATCH] Add alternate timestamp implementations Add mach_absolute_time and gettimeofday timestamp implementations, and fix clock_gettime check so that it can actually succeed --- configure.ac | 9 ++++++++- src/examples/Makefile.am | 2 +- src/frontend/Makefile.am | 2 +- src/network/network.cc | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 5d18274..a3d7298 100644 --- a/configure.ac +++ b/configure.ac @@ -70,7 +70,14 @@ AC_FUNC_FORK AC_FUNC_MALLOC AC_FUNC_MBRTOWC AC_FUNC_REALLOC -AC_CHECK_FUNCS([clock_gettime gettimeofday inet_ntoa iswprint memchr memset nl_langinfo setenv setlocale socket strchr strdup strerror strtol wcwidth]) +AC_CHECK_FUNCS([gettimeofday inet_ntoa iswprint memchr memset nl_langinfo setenv setlocale socket strchr strdup strerror strtol wcwidth]) + +AC_SEARCH_LIBS([clock_gettime], [rt], [AC_DEFINE([HAVE_CLOCK_GETTIME], [1], [Define if clock_gettime is available.])]) + +AC_CHECK_DECL([mach_absolute_time], + [AC_DEFINE([HAVE_MACH_ABSOLUTE_TIME], [1], + [Define if mach_absolute_time is available.])], + , [[#include ]]) AC_CHECK_DECL([htobe64], [AC_DEFINE([HAVE_HTOBE64], [1], diff --git a/src/examples/Makefile.am b/src/examples/Makefile.am index 2d562f8..cf18eb5 100644 --- a/src/examples/Makefile.am +++ b/src/examples/Makefile.am @@ -20,4 +20,4 @@ termemu_LDADD = ../terminal/libmoshterminal.a ../util/libmoshutil.a ../statesync ntester_SOURCES = ntester.cc ntester_CPPFLAGS = -I$(srcdir)/../statesync -I$(srcdir)/../terminal -I$(srcdir)/../network -I$(srcdir)/../crypto -I$(builddir)/../protobufs -ntester_LDADD = ../statesync/libmoshstatesync.a ../terminal/libmoshterminal.a ../network/libmoshnetwork.a ../crypto/libmoshcrypto.a ../protobufs/libmoshprotos.a -lutil -lrt -lm $(protobuf_LIBS) +ntester_LDADD = ../statesync/libmoshstatesync.a ../terminal/libmoshterminal.a ../network/libmoshnetwork.a ../crypto/libmoshcrypto.a ../protobufs/libmoshprotos.a -lutil -lm $(protobuf_LIBS) diff --git a/src/frontend/Makefile.am b/src/frontend/Makefile.am index af7a013..2fe4e78 100644 --- a/src/frontend/Makefile.am +++ b/src/frontend/Makefile.am @@ -1,6 +1,6 @@ AM_CPPFLAGS = -I$(srcdir)/../statesync -I$(srcdir)/../terminal -I$(srcdir)/../network -I$(srcdir)/../crypto -I$(builddir)/../protobufs -I$(srcdir)/../util AM_CXXFLAGS = $(WARNING_CXXFLAGS) $(PICKY_CXXFLAGS) -fno-default-inline -pipe -LDADD = ../crypto/libmoshcrypto.a ../network/libmoshnetwork.a ../statesync/libmoshstatesync.a ../terminal/libmoshterminal.a ../util/libmoshutil.a ../protobufs/libmoshprotos.a -lutil -lrt -lm $(protobuf_LIBS) +LDADD = ../crypto/libmoshcrypto.a ../network/libmoshnetwork.a ../statesync/libmoshstatesync.a ../terminal/libmoshterminal.a ../util/libmoshutil.a ../protobufs/libmoshprotos.a -lutil -lm $(protobuf_LIBS) bin_PROGRAMS = mosh-client mosh-server diff --git a/src/network/network.cc b/src/network/network.cc index 089a587..dd1bce7 100644 --- a/src/network/network.cc +++ b/src/network/network.cc @@ -16,6 +16,8 @@ along with this program. If not, see . */ +#include "config.h" + #include #include #include @@ -23,6 +25,14 @@ #include #include +#if HAVE_CLOCK_GETTIME + #include +#elif HAVE_MACH_ABSOLUTE_TIME + #include +#elif HAVE_GETTIMEOFDAY + #include +#endif + #include "dos_assert.h" #include "byteorder.h" #include "network.h" @@ -282,6 +292,7 @@ int Connection::port( void ) const uint64_t Network::timestamp( void ) { +#if HAVE_CLOCK_GETTIME struct timespec tp; if ( clock_gettime( CLOCK_MONOTONIC, &tp ) < 0 ) { @@ -292,6 +303,30 @@ uint64_t Network::timestamp( void ) millis += uint64_t( tp.tv_sec ) * 1000; return millis; +#elif HAVE_MACH_ABSOLUTE_TIME + static mach_timebase_info_data_t s_timebase_info; + + if (s_timebase_info.denom == 0) { + mach_timebase_info(&s_timebase_info); + } + + // NB: mach_absolute_time() returns "absolute time units" + // We need to apply a conversion to get milliseconds. + return ((mach_absolute_time() * s_timebase_info.numer) / (1000000 * s_timebase_info.denom)); +#elif HAVE_GETTIMEOFDAY + // NOTE: If time steps backwards, timeouts may be confused. + struct timeval tv; + if ( gettimeofday(&tv, NULL) ) { + throw NetworkException( "gettimeofday", errno ); + } + + uint64_t millis = tv.tv_usec / 1000; + millis += uint64_t( tv.tv_sec ) * 1000; + + return millis; +#else +# error "Don't know how to get a timestamp on this platform" +#endif } uint16_t Network::timestamp16( void )