From aa779e092c4f4d6a6691f3a4fc4074e6359337f8 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Wed, 4 Sep 2013 10:37:10 +0100 Subject: Don't move Capabilities in setNumCapabilities (#8209) We have various problems with reallocating the array of Capabilities, due to threads in waitForReturnCapability that are already holding a pointer to a Capability. Rather than add more locking to make this safer, I decided it would be easier to ensure that we never move the Capabilities at all. The capabilities array is now an array of pointers to Capabaility. There are extra indirections, but it rarely matters - we don't often access Capabilities via the array, normally we already have a pointer to one. I ran the parallel benchmarks and didn't see any difference. --- rts/sm/Sanity.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'rts/sm/Sanity.c') diff --git a/rts/sm/Sanity.c b/rts/sm/Sanity.c index 9b579abbbc..0d48ba2724 100644 --- a/rts/sm/Sanity.c +++ b/rts/sm/Sanity.c @@ -615,7 +615,7 @@ checkLocalMutableLists (nat cap_no) { nat g; for (g = 1; g < RtsFlags.GcFlags.generations; g++) { - checkMutableList(capabilities[cap_no].mut_lists[g], g); + checkMutableList(capabilities[cap_no]->mut_lists[g], g); } } @@ -756,7 +756,7 @@ findMemoryLeak (void) nat g, i; for (g = 0; g < RtsFlags.GcFlags.generations; g++) { for (i = 0; i < n_capabilities; i++) { - markBlocks(capabilities[i].mut_lists[g]); + markBlocks(capabilities[i]->mut_lists[g]); markBlocks(gc_threads[i]->gens[g].part_list); markBlocks(gc_threads[i]->gens[g].scavd_list); markBlocks(gc_threads[i]->gens[g].todo_bd); @@ -767,7 +767,7 @@ findMemoryLeak (void) for (i = 0; i < n_capabilities; i++) { markBlocks(nurseries[i].blocks); - markBlocks(capabilities[i].pinned_object_block); + markBlocks(capabilities[i]->pinned_object_block); } #ifdef PROFILING @@ -847,7 +847,7 @@ memInventory (rtsBool show) for (g = 0; g < RtsFlags.GcFlags.generations; g++) { gen_blocks[g] = 0; for (i = 0; i < n_capabilities; i++) { - gen_blocks[g] += countBlocks(capabilities[i].mut_lists[g]); + gen_blocks[g] += countBlocks(capabilities[i]->mut_lists[g]); gen_blocks[g] += countBlocks(gc_threads[i]->gens[g].part_list); gen_blocks[g] += countBlocks(gc_threads[i]->gens[g].scavd_list); gen_blocks[g] += countBlocks(gc_threads[i]->gens[g].todo_bd); @@ -859,10 +859,10 @@ memInventory (rtsBool show) for (i = 0; i < n_capabilities; i++) { ASSERT(countBlocks(nurseries[i].blocks) == nurseries[i].n_blocks); nursery_blocks += nurseries[i].n_blocks; - if (capabilities[i].pinned_object_block != NULL) { - nursery_blocks += capabilities[i].pinned_object_block->blocks; + if (capabilities[i]->pinned_object_block != NULL) { + nursery_blocks += capabilities[i]->pinned_object_block->blocks; } - nursery_blocks += countBlocks(capabilities[i].pinned_object_blocks); + nursery_blocks += countBlocks(capabilities[i]->pinned_object_blocks); } retainer_blocks = 0; -- cgit v1.2.1