From: Paul Eggert Date: Sat, 2 Aug 2014 22:58:09 +0000 (-0700) Subject: Fix bug with clang + directory_files_internal + GC. X-Git-Tag: emacs-24.3.93~24 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=a98a91ac4697c50b3ebb188c279b08b7799e6e3d;p=emacs.git 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 --- 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); }