void Heap::deallocateMediumLine(std::lock_guard<StaticMutex>& lock, MediumLine* line) { BASSERT(!line->refCount(lock)); MediumPage* page = MediumPage::get(line); size_t refCount = page->refCount(lock); page->deref(lock); switch (refCount) { case MediumPage::lineCount: { // First free line in the page. m_mediumPagesWithFreeLines[page->sizeClass()].push(page); break; } case 1: { // Last free line in the page. m_mediumPages.push(page); m_scavenger.run(); break; } } }
MediumPage* Heap::allocateMediumPage(std::lock_guard<StaticMutex>& lock, size_t sizeClass) { Vector<MediumPage*>& mediumPagesWithFreeLines = m_mediumPagesWithFreeLines[sizeClass]; while (mediumPagesWithFreeLines.size()) { MediumPage* page = mediumPagesWithFreeLines.pop(); if (!page->refCount(lock) || page->sizeClass() != sizeClass) // Page was promoted to the pages list. continue; return page; } MediumPage* page = [this, sizeClass]() { if (m_mediumPages.size()) return m_mediumPages.pop(); m_isAllocatingPages = true; return m_vmHeap.allocateMediumPage(); }(); page->setSizeClass(sizeClass); return page; }