From f3ef8385dc5ebe4fa67967d02eade6f8c74872da Mon Sep 17 00:00:00 2001 From: Helmut Eller Date: Fri, 3 Jan 2025 17:27:10 +0100 Subject: [PATCH] Delay processing of SIGPROF to the next safepoint * src/lisp.h (process_pending_profiler_signals): New function. * src/profiler.c (pending_profiler_signals): New variable. (handle_profiler_signal): Instead of calling add_sample, set pending_signals and increment pending_profiler_signals. (process_pending_profiler_signals): New function. * src/keyboard.c (process_pending_signals): Call process_pending_profiler_signals. --- src/keyboard.c | 1 + src/lisp.h | 1 + src/profiler.c | 17 ++++++++++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/keyboard.c b/src/keyboard.c index 94337d2ba8c..67a7f129a51 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -8190,6 +8190,7 @@ process_pending_signals (void) handle_async_input (); do_pending_atimers (); do_async_work (); + process_pending_profiler_signals (); } /* Undo any number of BLOCK_INPUT calls down to level LEVEL, diff --git a/src/lisp.h b/src/lisp.h index f8bf92d665c..0d9ed9b7495 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -5974,6 +5974,7 @@ extern bool profiler_memory_running; extern void malloc_probe (size_t); extern void syms_of_profiler (void); extern void mark_profiler (void); +extern void process_pending_profiler_signals (void); #ifdef DOS_NT diff --git a/src/profiler.c b/src/profiler.c index 66a0e37f92e..f22a0352e73 100644 --- a/src/profiler.c +++ b/src/profiler.c @@ -387,6 +387,9 @@ static enum profiler_cpu_running /* Hash-table log of CPU profiler. */ static struct profiler_log cpu; +/* Number of unprocessed profiler signals. */ +static uintptr_t pending_profiler_signals; + /* The current sampling interval in nanoseconds. */ static EMACS_INT current_sampling_interval; @@ -402,7 +405,19 @@ handle_profiler_signal (int signal) count += overruns; } #endif - add_sample (&cpu, count); + pending_signals = true; + pending_profiler_signals += count; +} + +void +process_pending_profiler_signals (void) +{ + uintptr_t count = pending_profiler_signals; + if (count) + { + pending_profiler_signals = 0; + add_sample (&cpu, count); + } } static void