]> git.eshelyaron.com Git - emacs.git/commit
Reduce GC mark-phase recursion by using explicit stack (bug#54698)
authorMattias Engdegård <mattiase@acm.org>
Sat, 2 Apr 2022 14:02:09 +0000 (16:02 +0200)
committerMattias Engdegård <mattiase@acm.org>
Mon, 4 Apr 2022 17:15:42 +0000 (19:15 +0200)
commit7a8798de95a57c8ff85f070075e0a0176b458578
tree0e4d9f09daeff6ae50d3a3c6b2b9e8c2cc0646fd
parent8103b060d89ac63a12c439087bd46c30da72cd97
Reduce GC mark-phase recursion by using explicit stack (bug#54698)

An explict stack of objects to be traversed for marking replaces
recursion for most common object types: conses, vectors, records, hash
tables, symbols, functions etc.  Recursion is still used for other
types but those are less common and thus not as likely to cause a
problem.

The stack grows dynamically as required which eliminates almost all C
stack overflow crashes in the GC.  There is also a nontrivial GC
performance improvement.

* src/alloc.c (GC_REMEMBER_LAST_MARKED, GC_CDR_COUNT): New.
(mark_char_table, struct mark_entry):
Remove (subsumed into process_mark_stack).
(struct mark_entry, struct mark_stack, mark_stk)
(mark_stack_empty_p, mark_stack_pop, grow_mark_stack)
(mark_stack_push_value, mark_stack_push_values)
(process_mark_stack): New.
(mark_object, mark_objects):
Just push the object(s) and let process_mark_stack do the work.
src/alloc.c