From 2effcc1b53eb3dfe69276e739dcff39aaf9a0a4d Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Thu, 5 Dec 2013 12:50:28 +0100 Subject: [PATCH] [sgen] Reverse the free-list after sweeping to be in address-order. --- mono/metadata/sgen-marksweep.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/mono/metadata/sgen-marksweep.c b/mono/metadata/sgen-marksweep.c index f104e157235..e7200c1197f 100755 --- a/mono/metadata/sgen-marksweep.c +++ b/mono/metadata/sgen-marksweep.c @@ -1539,6 +1539,7 @@ static void sweep_block (MSBlockInfo *block, gboolean during_major_collection) { int count; + void *reversed = NULL; if (!during_major_collection) g_assert (!sgen_concurrent_collection_in_progress ()); @@ -1564,10 +1565,15 @@ sweep_block (MSBlockInfo *block, gboolean during_major_collection) /* reset mark bits */ memset (block->mark_words, 0, sizeof (mword) * MS_NUM_MARK_WORDS); - /* - * FIXME: reverse free list so that it's in address - * order - */ + /* Reverse free list so that it's in address order */ + reversed = NULL; + while (block->free_list) { + void *next = *(void**)block->free_list; + *(void**)block->free_list = reversed; + reversed = block->free_list; + block->free_list = next; + } + block->free_list = reversed; block->swept = 1; } -- 2.25.1