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;