MINOR: clock: add now_mono_time_fast() function
Same as now_mono_time(), but for fast queries (less accurate)
Relies on coarse clock source (also known as fast clock source on
some systems).
Fallback to now_mono_time() if coarse source is not supported on the system.
diff --git a/include/haproxy/clock.h b/include/haproxy/clock.h
index a6f7cd2..9d5cdca 100644
--- a/include/haproxy/clock.h
+++ b/include/haproxy/clock.h
@@ -34,6 +34,7 @@
uint64_t now_cpu_time_thread(int thr);
uint64_t now_mono_time(void);
+uint64_t now_mono_time_fast(void);
uint64_t now_cpu_time(void);
void clock_set_local_source(void);
void clock_update_local_date(int max_wait, int interrupted);
diff --git a/include/haproxy/compat.h b/include/haproxy/compat.h
index b2ef8d0..aa4f952 100644
--- a/include/haproxy/compat.h
+++ b/include/haproxy/compat.h
@@ -295,6 +295,14 @@
*/
#define MAX_SEND_FD 252
+/* Some bsd kernels (ie: FreeBSD) offer the FAST clock source as equivalent
+ * to Linux COARSE clock source. Aliasing COARSE to FAST on such systems when
+ * COARSE is not already defined.
+ */
+#if !defined(CLOCK_MONOTONIC_COARSE) && defined(CLOCK_MONOTONIC_FAST)
+#define CLOCK_MONOTONIC_COARSE CLOCK_MONOTONIC_FAST
+#endif
+
#endif /* _HAPROXY_COMPAT_H */
/*
diff --git a/src/clock.c b/src/clock.c
index e852035..d4ed2d5 100644
--- a/src/clock.c
+++ b/src/clock.c
@@ -60,6 +60,27 @@
return ret;
}
+/* Returns the system's monotonic time in nanoseconds.
+ * Uses the coarse clock source if supported (for fast but
+ * less precise queries with limited resource usage).
+ * Fallback to now_mono_time() if coarse source is not supported,
+ * which may itself return 0 if not supported either.
+ */
+uint64_t now_mono_time_fast(void)
+{
+#if defined(CLOCK_MONOTONIC_COARSE)
+ struct timespec ts;
+
+ clock_gettime(CLOCK_MONOTONIC_COARSE, &ts);
+ return (ts.tv_sec * 1000000000ULL + ts.tv_nsec);
+#else
+ /* fallback to regular mono time,
+ * returns 0 if not supported
+ */
+ return now_mono_time();
+#endif
+}
+
/* returns the current thread's cumulated CPU time in nanoseconds if supported, otherwise zero */
uint64_t now_cpu_time(void)
{