Mercurial > emacs
changeset 55767:ee3a30045908
(marker_blocks_pending_free): New var.
(gc_sweep): Store free marker blocks on that list.
(Fgarbage_collect): Free them after undo-list cleanup.
author | Kim F. Storm <storm@cua.dk> |
---|---|
date | Tue, 25 May 2004 11:18:07 +0000 |
parents | d5fe47c900ee |
children | 821af7073c78 |
files | src/alloc.c |
diffstat | 1 files changed, 24 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/alloc.c Tue May 25 11:17:43 2004 +0000 +++ b/src/alloc.c Tue May 25 11:18:07 2004 +0000 @@ -2865,6 +2865,10 @@ union Lisp_Misc *marker_free_list; +/* Marker blocks which should be freed at end of GC. */ + +struct marker_block *marker_blocks_pending_free; + /* Total number of marker blocks now in use. */ int n_marker_blocks; @@ -2875,6 +2879,7 @@ marker_block = NULL; marker_block_index = MARKER_BLOCK_SIZE; marker_free_list = 0; + marker_blocks_pending_free = 0; n_marker_blocks = 0; } @@ -4529,6 +4534,18 @@ } } + /* Undo lists have been cleaned up, so we can free marker blocks now. */ + + { + struct marker_block *mblk; + + while ((mblk = marker_blocks_pending_free) != 0) + { + marker_blocks_pending_free = mblk->next; + lisp_free (mblk); + } + } + /* Clear the mark bits that we set in certain root slots. */ unmark_byte_stack (); @@ -5437,6 +5454,7 @@ register int num_free = 0, num_used = 0; marker_free_list = 0; + marker_blocks_pending_free = 0; for (mblk = marker_block; mblk; mblk = *mprev) { @@ -5467,19 +5485,20 @@ /* If this block contains only free markers and we have already seen more than two blocks worth of free markers then deallocate this block. */ -#if 0 - /* There may still be pointers to these markers from a buffer's - undo list, so don't free them. KFS 2004-05-21 / if (this_free == MARKER_BLOCK_SIZE && num_free > MARKER_BLOCK_SIZE) { *mprev = mblk->next; /* Unhook from the free list. */ marker_free_list = mblk->markers[0].u_free.chain; - lisp_free (mblk); n_marker_blocks--; + + /* It is not safe to free the marker block at this stage, + since there may still be pointers to these markers from + a buffer's undo list. KFS 2004-05-25. */ + mblk->next = marker_blocks_pending_free; + marker_blocks_pending_free = mblk; } else -#endif { num_free += this_free; mprev = &mblk->next;