# HG changeset patch # User Kim F. Storm # Date 1085483887 0 # Node ID ee3a3004590867ea3e403ff59e6d19e13adafd2a # Parent d5fe47c900eeaee1797f344d4789ab3a4e42d224 (marker_blocks_pending_free): New var. (gc_sweep): Store free marker blocks on that list. (Fgarbage_collect): Free them after undo-list cleanup. diff -r d5fe47c900ee -r ee3a30045908 src/alloc.c --- 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;