pkgsrc/mbone/dbeacon/patches/patch-dbeacon__posix.cpp
he 585c7b6ef5 It looks like we need another round of changes to get_timestamp(),
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.
2015-07-01 09:22:20 +00:00

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() {