KeyPageAddr KeyFile::fetchNewPage(bool leafPage) { KeyPageAddr addr; KeyPage page(m_pageInfo); KeyPageAddr freeList = getFreeList(); if(freeList == DB_NULLADDR) { try { addr = getLast() + 1; page.init(leafPage); writePage(addr, page); setLast(addr); } catch(sqlca) { return DB_NULLADDR; } } else { try { addr = freeList; readPage(freeList, page); logPage( freeList, page); freeList = page.getNextFree(); setFreeList(freeList,-1); page.init(leafPage); writePage(addr, page); } catch(sqlca) { return DB_NULLADDR; } } return addr; }
void MarkedAllocator::didConsumeFreeList() { if (m_currentBlock) m_currentBlock->didConsumeFreeList(); setFreeList(FreeList()); m_currentBlock = nullptr; }
void MarkedAllocator::prepareForAllocation() { m_lastActiveBlock = nullptr; m_currentBlock = nullptr; setFreeList(FreeList()); m_allocationCursor = 0; m_emptyCursor = 0; m_unsweptCursor = 0; m_eden.clearAll(); if (UNLIKELY(Options::useImmortalObjects())) { // FIXME: Make this work again. // https://bugs.webkit.org/show_bug.cgi?id=162296 RELEASE_ASSERT_NOT_REACHED(); } }
void* MarkedAllocator::tryAllocateIn(MarkedBlock::Handle* block) { ASSERT(block); ASSERT(!block->hasAnyNewlyAllocated()); ASSERT(!block->isFreeListed()); FreeList freeList = block->sweep(MarkedBlock::Handle::SweepToFreeList); // It's possible to stumble on a completely full block. Marking tries to retire these, but // that algorithm is racy and may forget to do it sometimes. if (freeList.allocationWillFail()) { ASSERT(block->isFreeListed()); block->unsweepWithNoNewlyAllocated(); ASSERT(!block->isFreeListed()); ASSERT(!isEmpty(block)); ASSERT(!isCanAllocateButNotEmpty(block)); return nullptr; } m_currentBlock = block; setFreeList(freeList); void* result; if (m_freeList.remaining) { unsigned cellSize = m_cellSize; m_freeList.remaining -= cellSize; result = m_freeList.payloadEnd - m_freeList.remaining - cellSize; } else { FreeCell* head = m_freeList.head; m_freeList.head = head->next; result = head; } RELEASE_ASSERT(result); setIsEden(m_currentBlock, true); m_markedSpace->didAllocateInBlock(m_currentBlock); return result; }
void KeyFile::releasePage(KeyPageAddr addr) { KeyPage page(m_pageInfo); page.setNextFree(getFreeList()); writePage(addr, page); setFreeList(addr,1); }