diff options
author | Chris Wilson <chris+github@qwirx.com> | 2006-11-23 19:54:51 +0000 |
---|---|---|
committer | Chris Wilson <chris+github@qwirx.com> | 2006-11-23 19:54:51 +0000 |
commit | 366574d921bf39a356d558ef8d61d78181a7af9b (patch) | |
tree | c71d9042856a032e8627e87158d58664684999da | |
parent | ca0c40ce216de416cd8ada05ab369c2971ee4a71 (diff) |
Use gettimeofday() to increase accuracy of GetCurrentBoxTime() on
platforms which support it. Fixes busy waits for 1 second in backup
client when time for next backup is not on a 1 second boundary (which
it never is). (refs #3)
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | lib/common/BoxTime.cpp | 32 |
2 files changed, 29 insertions, 5 deletions
diff --git a/configure.ac b/configure.ac index 8b6221a2..99165a38 100644 --- a/configure.ac +++ b/configure.ac @@ -158,7 +158,7 @@ AC_FUNC_CLOSEDIR_VOID AC_FUNC_ERROR_AT_LINE AC_TYPE_SIGNAL AC_FUNC_STAT -AC_CHECK_FUNCS([getpeereid lchown setproctitle getpid]) +AC_CHECK_FUNCS([getpeereid lchown setproctitle getpid gettimeofday]) # NetBSD implements kqueue too differently for us to get it fixed by 0.10 # TODO: Remove this when NetBSD kqueue implementation is working netbsd_hack=`echo $target_os | sed 's/netbsd.*/netbsd/'` diff --git a/lib/common/BoxTime.cpp b/lib/common/BoxTime.cpp index 960fc329..eafb244f 100644 --- a/lib/common/BoxTime.cpp +++ b/lib/common/BoxTime.cpp @@ -9,7 +9,17 @@ #include "Box.h" -#include <time.h> +#ifdef HAVE_SYS_TIME_H + #include <sys/time.h> +#endif +#ifdef HAVE_TIME_H + #include <time.h> +#endif +#ifdef HAVE_SYSLOG_H + #include <syslog.h> +#endif +#include <errno.h> +#include <string.h> #include "BoxTime.h" @@ -19,13 +29,27 @@ // // Function // Name: GetCurrentBoxTime() -// Purpose: Returns the current time as a box time. (1 sec precision) +// Purpose: Returns the current time as a box time. +// (1 sec precision, or better if supported by system) // Created: 2003/10/08 // // -------------------------------------------------------------------------- box_time_t GetCurrentBoxTime() { + #ifdef HAVE_GETTIMEOFDAY + struct timeval tv; + if (gettimeofday(&tv, NULL) != 0) + { + ::syslog(LOG_ERR, "gettimeofday() failed (%s), " + "dropping precision", strerror(errno)); + } + else + { + box_time_t timeNow = (tv.tv_sec * MICRO_SEC_IN_SEC_LL) + + tv.tv_usec; + return timeNow; + } + #endif + return SecondsToBoxTime(time(0)); } - - |