From 91e6df01fabf74884b95728171d54d68da228d19 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 3 May 2019 17:21:18 +0200 Subject: [PATCH] MINOR: threads: add each thread's clockid into the global thread_info This is the per-thread CPU runtime clock, it will be used to measure the CPU usage of each thread and by the lockup detection mechanism. It must only be retrieved at the beginning of run_thread_poll_loop() since the thread must already have been started for this. But it must be done before performing any per-thread initcall so that all thread init functions have access to the clock ID. Note that it could make sense to always have this clockid available even in non-threaded situations and place the process' clock there instead. But it would add portability issues which are currently easy to deal with by disabling threads so it may not be worth it for now. --- include/types/global.h | 1 + src/haproxy.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/include/types/global.h b/include/types/global.h index db8829567..030a553e2 100644 --- a/include/types/global.h +++ b/include/types/global.h @@ -245,6 +245,7 @@ extern int atexit_flag; extern struct thread_info { __decl_hathreads(pthread_t pthread); + __decl_hathreads(clockid_t clock_id); } thread_info[MAX_THREADS]; /* bit values to go with "warned" above */ diff --git a/src/haproxy.c b/src/haproxy.c index 742268172..692c333f0 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -2497,6 +2497,11 @@ static void *run_thread_poll_loop(void *data) struct per_thread_deinit_fct *ptdf; ha_set_tid((unsigned long)data); + +#ifdef USE_THREAD + pthread_getcpuclockid(pthread_self(), &thread_info[tid].clock_id); +#endif + tv_update_date(-1,-1); /* per-thread init calls performed here are not allowed to snoop on