From a98a91ac4697c50b3ebb188c279b08b7799e6e3d Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 2 Aug 2014 15:58:09 -0700 Subject: [PATCH] Fix bug with clang + directory_files_internal + GC. * src/dired.c (directory_files_internal): Use a volatile variable to prevent the compiler from optimizing away all copies of a local. I wonder how many other GC-related bugs like this lurk elsewhere? Fixes: debbugs:16986 --- src/ChangeLog | 5 +++++ src/dired.c | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/src/ChangeLog b/src/ChangeLog index b85aee0d35a..93c27a6e565 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,10 @@ 2014-08-02 Paul Eggert + Fix bug with clang + directory_files_internal + GC (Bug#16986). + * dired.c (directory_files_internal): Use a volatile variable + to prevent the compiler from optimizing away all copies of a local. + I wonder how many other GC-related bugs like this lurk elsewhere? + Avoid 100% CPU utilization on ssh session exit (Bug#17691). * xterm.h (struct x_display_info): New member 'connection'. * xterm.c (x_term_init, x_delete_terminal): Set and use it, diff --git a/src/dired.c b/src/dired.c index 55b2f6658c7..c2db1f02782 100644 --- a/src/dired.c +++ b/src/dired.c @@ -150,6 +150,12 @@ directory_files_internal (Lisp_Object directory, Lisp_Object full, Lisp_Object w32_save = Qnil; #endif + /* Don't let the compiler optimize away all copies of DIRECTORY, + which would break GC; see Bug#16986. Although this is required + only in the common case where GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS, + it shouldn't break anything in the other cases. */ + Lisp_Object volatile directory_volatile = directory; + /* Because of file name handlers, these functions might call Ffuncall, and cause a GC. */ list = encoded_directory = dirfilename = Qnil; @@ -325,6 +331,7 @@ directory_files_internal (Lisp_Object directory, Lisp_Object full, list = Fsort (Fnreverse (list), attrs ? Qfile_attributes_lessp : Qstring_lessp); + (void) directory_volatile; RETURN_UNGCPRO (list); } -- 2.39.5