void LargeHeapBucket::ConcurrentTransferSweptObjects(RecyclerSweep& recyclerSweep) { #if ENABLE_PARTIAL_GC Assert(!recyclerSweep.InPartialCollectMode()); #endif Assert(!recyclerSweep.IsBackground()); HeapBlockList::ForEachEditing(this->pendingSweepLargeBlockList, [this](LargeHeapBlock * heapBlock) { heapBlock->TransferSweptObjects(); ReinsertLargeHeapBlock(heapBlock); }); this->pendingSweepLargeBlockList = nullptr; #if ENABLE_PARTIAL_GC // If we did a background finish partial collect, we have left the partialSweptLargeBlockList // there because can't reinsert the heap block in the background, do it here now. HeapBlockList::ForEachEditing(this->partialSweptLargeBlockList, [this](LargeHeapBlock * heapBlock) { ReinsertLargeHeapBlock(heapBlock); }); this->partialSweptLargeBlockList = nullptr; #endif }
void LargeHeapBucket::ConcurrentPartialTransferSweptObjects(RecyclerSweep& recyclerSweep) { Assert(recyclerSweep.InPartialCollectMode()); Assert(!recyclerSweep.IsBackground()); RECYCLER_SLOW_CHECK(this->VerifyLargeHeapBlockCount()); LargeHeapBlock * list = this->pendingSweepLargeBlockList; this->pendingSweepLargeBlockList = nullptr; HeapBlockList::ForEachEditing(list, [this](LargeHeapBlock * heapBlock) { // GC-REVIEW: We could maybe reuse the large objects heapBlock->PartialTransferSweptObjects(); heapBlock->SetNextBlock(this->partialSweptLargeBlockList); this->partialSweptLargeBlockList = heapBlock; }); RECYCLER_SLOW_CHECK(this->VerifyLargeHeapBlockCount()); }