Files
pkgsrc-ng/mbone/dbeacon/patches/patch-dbeacon__posix.cpp
2016-01-21 23:42:40 +01:00

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