From 335828b3e367b4fc19221055f20bf4b7cee16c56 Mon Sep 17 00:00:00 2001 From: Vlad Brezae Date: Thu, 2 Mar 2017 16:44:56 +0200 Subject: [PATCH] [sgen] Make sure workers don't have evacuating blocks on the free-lists Double copying of an object during a collection is not allowed. If we allocate from an evacuating block this can happen. --- mono/sgen/sgen-marksweep.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/mono/sgen/sgen-marksweep.c b/mono/sgen/sgen-marksweep.c index 450adcf3443..3492ff6058a 100644 --- a/mono/sgen/sgen-marksweep.c +++ b/mono/sgen/sgen-marksweep.c @@ -1555,6 +1555,25 @@ sgen_worker_clear_free_block_lists (WorkerData *worker) } } +static void +sgen_worker_clear_free_block_lists_evac (WorkerData *worker) +{ + int i, j; + + if (!worker->free_block_lists) + return; + + for (i = 0; i < MS_BLOCK_TYPE_MAX; i++) { + for (j = 0; j < num_block_obj_sizes; j++) { + if (((MSBlockInfo***) worker->free_block_lists) [i][j]) + SGEN_ASSERT (0, !((MSBlockInfo***) worker->free_block_lists) [i][j]->next_free, "Why do we have linked free blocks on the workers"); + + if (evacuate_block_obj_sizes [j]) + ((MSBlockInfo***) worker->free_block_lists) [i][j] = NULL; + } + } +} + static void sweep_start (void) { @@ -2038,6 +2057,9 @@ major_start_major_collection (void) sgen_evacuation_freelist_blocks (&free_block_lists [MS_BLOCK_FLAG_REFS][i], i); } + /* We expect workers to have very few blocks on the freelist, just evacuate them */ + sgen_workers_foreach (sgen_worker_clear_free_block_lists_evac); + if (lazy_sweep && concurrent_sweep) { /* * sweep_blocks_job is created before sweep_finish, which we wait for above -- 2.25.1