mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-06 11:50:51 -08:00
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
This commit is contained in:
parent
7f0ff25b7a
commit
a98a91ac46
2 changed files with 12 additions and 0 deletions
|
|
@ -1,5 +1,10 @@
|
|||
2014-08-02 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue