From: Aurelien DARRAGON Date: Fri, 25 Nov 2022 07:56:46 +0000 (+0100) Subject: MINOR: clock: add now_mono_time_fast() function X-Git-Tag: v2.8-dev8~89 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=07cbd8e0741d141e19f7b11cbd873c142bb84cae;p=thirdparty%2Fhaproxy.git 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 a6f7cd2dbf..9d5cdca74b 100644 --- a/include/haproxy/clock.h +++ b/include/haproxy/clock.h @@ -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); diff --git a/include/haproxy/compat.h b/include/haproxy/compat.h index b2ef8d0b2b..aa4f95220a 100644 --- a/include/haproxy/compat.h +++ b/include/haproxy/compat.h @@ -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 */ /* diff --git a/src/clock.c b/src/clock.c index e852035793..d4ed2d54ab 100644 --- a/src/clock.c +++ b/src/clock.c @@ -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) {