The need for this change stems from the fact that Windows doesn't support
partial unmapping (MEM_RELEASE implies the entire allocated region). So we
now have to keep track of the reserved region and the committed region, so that
we can function without the trimming we did when dealing with larger alignments.
Instead of just having a ReservedAddressRange per chunk, we introduce a
LargeChunkHeader (and LargeChunk namespace) that additionally holds the
committed size and the usable size. The former is needed for stats purposes,
the latter is used by the frontend. Requiring both is debatable, we could only
work with the usable size but then be off by up to a page per chunk when
dealing with stats.
Additionally, we introduce more stats since they turned out to be useful for
experiments, and a PrintStats function that will be used by the combined
allocator in later patch.
This is definitely confusing. One getHeader() expects user mem ptr, another expects chunk header ptr. Not sure what's the best way to improve it yet.