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