]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: clock: add now_mono_time_fast() function
authorAurelien DARRAGON <adarragon@haproxy.com>
Fri, 25 Nov 2022 07:56:46 +0000 (08:56 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Wed, 19 Apr 2023 09:03:31 +0000 (11:03 +0200)
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.

include/haproxy/clock.h
include/haproxy/compat.h
src/clock.c

index a6f7cd2dbf9158cbf4f879ece6a0322144cbd43b..9d5cdca74bc500394ba963ff934e015cfaa9af27 100644 (file)
@@ -34,6 +34,7 @@ extern THREAD_LOCAL struct timeval date;          /* the real current date (wall
 
 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);
index b2ef8d0b2b7c3559ee2c4d6766000edb63a876fe..aa4f95220a6db016ddcb03a69f8502a5508ff5cb 100644 (file)
@@ -295,6 +295,14 @@ typedef struct { } empty_t;
  */
 #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 */
 
 /*
index e8520357936ff8fb8f4622af78e604f090691950..d4ed2d54ab1a7a319c51cf7101ac5993176b98c7 100644 (file)
@@ -60,6 +60,27 @@ uint64_t now_mono_time(void)
        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)
 {