From 7cdf5751b5111bdcc582118de2e1e9f4cabfba41 Mon Sep 17 00:00:00 2001 From: Valentine Krasnobaeva Date: Mon, 15 Jul 2024 14:56:24 +0200 Subject: [PATCH] MINOR: debug: prepare feed_post_mortem_late Process runtime information could be very useful in post_mortem, but we have to collect it just before calling run_poll_loop(). Like this we are sure, that we've successfully applied all configuration parameters and what we've collected are the latest runtime settings. The most appropraite place to collect such information is feed_post_mortem_late(). It's called in each thread, but puts thread info in the post_mortem only when it's in the last thread context. As it's called under mutex lock, other threads at this moment have to wait until feed_post_mortem_late() and another initialization functions from per_thread_init_list will finish. The number of threads could be large. So, to avoid spending a lot of time under the lock, let's exit immediately from feed_post_mortem_late(), if it wasn't called in the last thread. --- src/debug.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/debug.c b/src/debug.c index 679a4e127..e57367c1e 100644 --- a/src/debug.c +++ b/src/debug.c @@ -2414,14 +2414,23 @@ void post_mortem_add_component(const char *name, const char *version, static int feed_post_mortem_late() { static int per_thread_info_collected; + int i; - if (HA_ATOMIC_ADD_FETCH(&per_thread_info_collected, 1) == global.nbthread) { - int i; - for (i = 0; i < global.nbthread; i++) { - post_mortem.process.thread_info[i].pth_id = ha_thread_info[i].pth_id; - post_mortem.process.thread_info[i].stack_top = ha_thread_info[i].stack_top; - } + if (HA_ATOMIC_ADD_FETCH(&per_thread_info_collected, 1) != global.nbthread) + return 1; + + /* Collect thread info, only when we are in the last thread context. + * feed_post_mortem_late() is registered in per_thread_init_list. Each + * thread takes a mutex before looping over this list, so + * feed_post_mortem_late() will be called by each thread in exclusive + * manner, one by one in synchronious order. Thread unlocks mutex only + * after executing all init functions from this list. + */ + for (i = 0; i < global.nbthread; i++) { + post_mortem.process.thread_info[i].pth_id = ha_thread_info[i].pth_id; + post_mortem.process.thread_info[i].stack_top = ha_thread_info[i].stack_top; } + return 1; }