From 4c6f45fa8eef1a15d5790c1f3d3e608b548015db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= Date: Tue, 17 Sep 2024 13:07:01 +0200 Subject: [PATCH] Re-enable GC mark trace buffer by default Enable GC_REMEMBER_LAST_MARKED by default (it was disabled in Emacs 29) to make it easier to debug difficult-to-reproduce GC problems encountered by users. This increases GC costs by about 5 %, which can be avoided by turning the mark trace buffer back off using the new --disable-gc-mark-trace option. See discussion at https://lists.gnu.org/archive/html/emacs-devel/2024-09/msg00240.html * configure.ac (--disable-gc-mark-trace): New config option. * etc/NEWS: Mention it. * src/alloc.c: Enable it by default and avoid a compiler warning. --- configure.ac | 11 +++++++++++ etc/NEWS | 7 +++++++ src/alloc.c | 5 ++--- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index f63ef180c5b..5eaa1c7f962 100644 --- a/configure.ac +++ b/configure.ac @@ -776,6 +776,17 @@ AS_IF([test "$with_android" = no || test -n "$XCONFIGURE"],[ [android_enable_checking=yes export android_enable_checking])]) +AC_ARG_ENABLE([gc-mark-trace], + [AS_HELP_STRING([--disable-gc-mark-trace], + [disable the mark trace buffer used for debugging the Emacs + garbage collector])], + [ac_enable_gc_mark_trace="${enableval}"], + [ac_enable_gc_mark_trace=yes]) +if test "x$ac_enable_gc_mark_trace" = xyes ; then + AC_DEFINE([GC_REMEMBER_LAST_MARKED], [1], + [Define to 1 to enable GC mark trace buffer.]) +fi + dnl The name of this option is unfortunate. It predates, and has no dnl relation to, the "sampling-based elisp profiler" added in 24.3. dnl Actually, it stops it working. diff --git a/etc/NEWS b/etc/NEWS index 9b66e67c49a..2bb419ea129 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -55,6 +55,13 @@ and to resolve potential incompatibilities between GNU/Linux and *BSD versions of ALSA. Use '--with-sound=alsa' to build with ALSA on these operating systems instead. +--- +** New configuration option '--disable-gc-mark-trace'. +This disables the GC mark trace buffer for about 5 % better garbage +collection performance. Doing so may make it more difficult for Emacs +developers to help finding GC-related bugs that you run into, which is +why it the mark trace buffer is enabled by default. + * Startup Changes in Emacs 30.1 diff --git a/src/alloc.c b/src/alloc.c index 666f77bfce1..258a3d1aaf2 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -6849,11 +6849,10 @@ mark_glyph_matrix (struct glyph_matrix *matrix) } } -/* Whether to remember a few of the last marked values for debugging. */ -#define GC_REMEMBER_LAST_MARKED 0 - #if GC_REMEMBER_LAST_MARKED +/* Remember a few of the last marked values for debugging purposes. */ enum { LAST_MARKED_SIZE = 1 << 9 }; /* Must be a power of 2. */ +extern Lisp_Object last_marked[LAST_MARKED_SIZE]; Lisp_Object last_marked[LAST_MARKED_SIZE] EXTERNALLY_VISIBLE; static int last_marked_index; #endif