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;
}
Exemple #2
0
void MarkedAllocator::didConsumeFreeList()
{
    if (m_currentBlock)
        m_currentBlock->didConsumeFreeList();
    
    setFreeList(FreeList());
    m_currentBlock = nullptr;
}
Exemple #3
0
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();
    }
}
Exemple #4
0
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);
}