From 4776afb4e22a5fb1d1a66ce823a50c4d12f52610 Mon Sep 17 00:00:00 2001 From: Vlad Brezae Date: Mon, 11 Apr 2016 22:03:28 +0300 Subject: [PATCH] [sgen] Don't reallocate mod_union at each major --- mono/sgen/sgen-los.c | 14 ++++++++------ mono/sgen/sgen-marksweep.c | 11 ++++++----- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/mono/sgen/sgen-los.c b/mono/sgen/sgen-los.c index 5cb3c71253d..c22afd22f21 100644 --- a/mono/sgen/sgen-los.c +++ b/mono/sgen/sgen-los.c @@ -307,7 +307,8 @@ free_los_section_memory (LOSObject *obj, size_t size) void sgen_los_free_object (LOSObject *obj) { - SGEN_ASSERT (0, !obj->cardtable_mod_union, "We should never free a LOS object with a mod-union table."); + if (obj->cardtable_mod_union) + sgen_card_table_free_mod_union (obj->cardtable_mod_union, (char*)obj->data, sgen_los_object_size (obj)); #ifndef LOS_DUMMY mword size = sgen_los_object_size (obj); @@ -433,12 +434,13 @@ sgen_los_sweep (void) for (bigobj = los_object_list; bigobj;) { SGEN_ASSERT (0, !SGEN_OBJECT_IS_PINNED (bigobj->data), "Who pinned a LOS object?"); - if (bigobj->cardtable_mod_union) { - sgen_card_table_free_mod_union (bigobj->cardtable_mod_union, (char*)bigobj->data, sgen_los_object_size (bigobj)); - bigobj->cardtable_mod_union = NULL; - } - if (sgen_los_object_is_pinned (bigobj->data)) { + if (bigobj->cardtable_mod_union) { + mword obj_size = sgen_los_object_size (bigobj); + mword num_cards = sgen_card_table_number_of_cards_in_range ((mword) bigobj->data, obj_size); + memset (bigobj->cardtable_mod_union, 0, num_cards); + } + sgen_los_unpin_object (bigobj->data); sgen_update_heap_boundaries ((mword)bigobj->data, (mword)bigobj->data + sgen_los_object_size (bigobj)); } else { diff --git a/mono/sgen/sgen-marksweep.c b/mono/sgen/sgen-marksweep.c index c7ec976fe21..2bbfaff19c6 100644 --- a/mono/sgen/sgen-marksweep.c +++ b/mono/sgen/sgen-marksweep.c @@ -375,11 +375,14 @@ ms_get_empty_block (void) * list, where it will either be freed later on, or reused in nursery collections. */ static void -ms_free_block (void *block) +ms_free_block (MSBlockInfo *info) { void *empty; + char *block = MS_BLOCK_FOR_BLOCK_INFO (info); sgen_memgov_release_space (MS_BLOCK_SIZE, SPACE_MAJOR); + if (info->cardtable_mod_union) + sgen_card_table_free_mod_union (info->cardtable_mod_union, block, MS_BLOCK_SIZE); memset (block, 0, MS_BLOCK_SIZE); do { @@ -1506,10 +1509,8 @@ ensure_block_is_checked_for_sweeping (guint32 block_index, gboolean wait, gboole count = MS_BLOCK_FREE / block->obj_size; - if (block->cardtable_mod_union) { - sgen_card_table_free_mod_union (block->cardtable_mod_union, MS_BLOCK_FOR_BLOCK_INFO (block), MS_BLOCK_SIZE); - block->cardtable_mod_union = NULL; - } + if (block->cardtable_mod_union) + memset (block->cardtable_mod_union, 0, CARDS_PER_BLOCK); /* Count marked objects in the block */ for (i = 0; i < MS_NUM_MARK_WORDS; ++i) -- 2.25.1