NonMoving: Don't do major GC if one is already running
authorBen Gamari <ben@smart-cactus.org>
Fri, 17 May 2019 23:18:42 +0000 (19:18 -0400)
committerBen Gamari <ben@smart-cactus.org>
Sun, 19 May 2019 18:50:02 +0000 (14:50 -0400)
commit57a995c4b33dae24707e9b8760c18feb127c5b52
tree1247e4ebcc8133e384dae4f4746d9d031bc649eb
parent9bc0f119c9cb64a6ac66ff9dd7d07f1015cdd963
NonMoving: Don't do major GC if one is already running

Previously we would perform a preparatory moving collection, resulting
in many things being added to the mark queue. When we finished with this
we would realize in nonmovingCollect that there was already a collection
running, in which case we would simply not run the nonmoving collector.

However, it was very easy to end up in a "treadmilling" situation: all
subsequent GC following the first failed major GC would be scheduled as
major GCs. Consequently we would continuously feed the concurrent
collector with more mark queue entries and it would never finish.

This patch aborts the major collection far earlier, meaning that we
avoid adding nonmoving objects to the mark queue and allowing the
concurrent collector to finish.
rts/sm/GC.c
rts/sm/NonMoving.h