From: Willy Tarreau Date: Fri, 3 May 2019 15:21:18 +0000 (+0200) Subject: MINOR: threads: add each thread's clockid into the global thread_info X-Git-Tag: v2.0-dev4~56 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=91e6df01fabf74884b95728171d54d68da228d19;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/include/types/global.h b/include/types/global.h index db8829567c..030a553e28 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 7422681723..692c333f0b 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