Sweep the heap block containing the object in free_object ().
authorZoltan Varga <vargaz@gmail.com>
Mon, 19 Nov 2012 12:52:00 +0000 (13:52 +0100)
committerZoltan Varga <vargaz@gmail.com>
Mon, 19 Nov 2012 12:52:00 +0000 (13:52 +0100)
mono/metadata/sgen-marksweep.c

index 6e9dea778bded040938737e8e74797d0e7cd1eda..2813146a887daf15974569b9b1f637eba3dd3f68 100644 (file)
@@ -783,6 +783,9 @@ free_object (char *obj, size_t size, gboolean pinned)
 {
        MSBlockInfo *block = MS_BLOCK_FOR_OBJ (obj);
        int word, bit;
+
+       if (!block->swept)
+               sweep_block (block);
        DEBUG (9, g_assert ((pinned && block->pinned) || (!pinned && !block->pinned)));
        DEBUG (9, g_assert (MS_OBJ_ALLOCED (obj, block)));
        MS_CALC_MARK_BIT (word, bit, obj);
@@ -1452,7 +1455,6 @@ sweep_block_for_size (MSBlockInfo *block, int count, int obj_size)
        }
 }
 
-// FIXME: Consistency check, heap traversal
 /*
  * sweep_block:
  *
@@ -1562,8 +1564,6 @@ ms_sweep (void)
                }
                if (nused) {
                        have_live = TRUE;
-                       if (!has_pinned)
-                               slots_used [obj_size_index] += nused;
                }
                if (nused < count)
                        have_free = TRUE;
@@ -1574,6 +1574,7 @@ ms_sweep (void)
                if (have_live) {
                        if (!has_pinned) {
                                ++num_blocks [obj_size_index];
+                               slots_used [obj_size_index] += nused;
                                slots_available [obj_size_index] += count;
                        }