I'm going to use this task to keep track of what we still need to do around compact regions before 8.2.1, and so I have somewhere to hang diffs.
Here's the current ToDo list:
- compaction should be interruptible by GC, otherwise we block a multithreaded program while compacting (I know how to do this and have a prototype, just need to finish it).
- Make it work with profiling
- We should have an API that doesn't require specifying a size, just
compact :: NFData a => a -> IO (Compact a)
- libraries/compact/tests failures with
EXTRA_HC_OPTS="-debug -with-rtsopts=-DS"(I think this is the static object problem, see below)
- Do we need both
totalDataW? It looks like one of them is redundant to me.
- What happens if we try to compact something that refers to a large block? One larger than a megablock?
- Static Objects: currently compaction copies static objects into the compact. This violates some invariants (_STATIC objects should not be on the heap), but is important because we would otherwise have pointers from compacts to static objects that would need to be followed during GC, in order to find CAFs. I don't like this at all.
And in general, improve the comments.