(sweep_weak_hash_tables): Fix the code taking unmarked

tables out of the list of all weak hash tables.
This commit is contained in:
Gerd Moellmann 2000-08-07 12:04:06 +00:00
parent ff3d95733d
commit ac0e96eefc
2 changed files with 15 additions and 15 deletions

View file

@ -1,5 +1,8 @@
2000-08-07 Gerd Moellmann <gerd@gnu.org>
* fns.c (sweep_weak_hash_tables): Fix the code taking unmarked
tables out of the list of all weak hash tables.
* xdisp.c (ensure_echo_area_buffers): If a buffer was killed, and
a new buffer is created, make sure echo_area_buffer[] references
the new buffer.

View file

@ -4380,8 +4380,8 @@ sweep_weak_table (h, remove_entries_p)
void
sweep_weak_hash_tables ()
{
Lisp_Object table;
struct Lisp_Hash_Table *h, *prev;
Lisp_Object table, used, next;
struct Lisp_Hash_Table *h;
int marked;
/* Mark all keys and values that are in use. Keep on marking until
@ -4403,27 +4403,24 @@ sweep_weak_hash_tables ()
while (marked);
/* Remove tables and entries that aren't used. */
prev = NULL;
for (table = Vweak_hash_tables; !GC_NILP (table); table = h->next_weak)
for (table = Vweak_hash_tables, used = Qnil; !GC_NILP (table); table = next)
{
prev = h;
h = XHASH_TABLE (table);
next = h->next_weak;
if (h->size & ARRAY_MARK_FLAG)
{
/* TABLE is marked as used. Sweep its contents. */
if (XFASTINT (h->count) > 0)
sweep_weak_table (h, 1);
}
else
{
/* Table is not marked, and will thus be freed.
Take it out of the list of weak hash tables. */
if (prev)
prev->next_weak = h->next_weak;
else
Vweak_hash_tables = h->next_weak;
/* Add table to the list of used weak hash tables. */
h->next_weak = used;
used = table;
}
}
Vweak_hash_tables = used;
}