585c7b6ef5
this time from using gettimeofday() to using cloc_gettime(CLOCK_MONOTONIC), to avoid the effects of UTC leap second insertion which IIUC steps the system clock back one second, and will cause the single assert() in dbeacon.cpp to fire. Unfortunately, my core dump was incomplete due to a full root file system... PKGREVISION bumped.
52 lines
1.3 KiB
C++
52 lines
1.3 KiB
C++
$NetBSD: patch-dbeacon__posix.cpp,v 1.3 2015/07/01 09:22:20 he Exp $
|
|
|
|
Replace use of times() with clock_gettime(CLOCK_MONOTONIC), since
|
|
all we use it for is to get a millisecond timestamp, and with a
|
|
32-bit unsigned clock_t and 100Hz tick, times() wraps around every
|
|
500 days or so, and the code then falls into an assert() in
|
|
dbeacon.cpp.
|
|
|
|
Still retry a few times if clock_gettime() for some reason should
|
|
decide to fail.
|
|
|
|
--- dbeacon_posix.cpp.orig 2007-06-09 11:35:57.000000000 +0000
|
|
+++ dbeacon_posix.cpp
|
|
@@ -23,8 +23,10 @@
|
|
#include <netinet/in.h>
|
|
#include <arpa/inet.h>
|
|
#include <sys/time.h>
|
|
+#include <time.h>
|
|
#include <netdb.h>
|
|
#include <unistd.h>
|
|
+#include <syslog.h>
|
|
#include <sys/uio.h>
|
|
#include <sys/times.h>
|
|
|
|
@@ -515,11 +517,24 @@ void address::set(const sockaddr *sa) {
|
|
}
|
|
|
|
uint64_t get_timestamp() {
|
|
- struct tms tmp;
|
|
+ struct timespec ts;
|
|
+ uint64_t timestamp;
|
|
+ int n = 0;
|
|
|
|
- uint64_t v = times(&tmp);
|
|
+ retry:
|
|
+ if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0) {
|
|
+ log(LOG_WARNING, "clock_gettime(CLOCK_MONOTONIC) failed: %m");
|
|
+ if (++n < 5)
|
|
+ goto retry;
|
|
+ else
|
|
+ log(LOG_ERR,
|
|
+ "clock_gettime(CLOCK_MONOTONIC) failed after 5 retries: %m");
|
|
+ }
|
|
+ timestamp = ts.tv_sec;
|
|
+ timestamp *= 1000;
|
|
+ timestamp += ts.tv_nsec / 1000000;
|
|
|
|
- return (v * 1000) / sysconf(_SC_CLK_TCK);
|
|
+ return timestamp;
|
|
}
|
|
|
|
uint64_t get_time_of_day() {
|