void LinearAllocator::ensureNext(size_t size) { if (fitsInCurrentPage(size)) return; if (m_currentPage && m_pageSize < MAX_PAGE_SIZE) { m_pageSize = std::min(MAX_PAGE_SIZE, m_pageSize * 2); m_pageSize = ALIGN(m_pageSize); } m_wastedSpace += m_pageSize; Page* p = newPage(m_pageSize); if (m_currentPage) m_currentPage->setNext(p); m_currentPage = p; if (!m_pages) m_pages = m_currentPage; m_next = start(m_currentPage); }
void LinearAllocator::ensureNext(size_t size) { if (fitsInCurrentPage(size)) return; if (mCurrentPage && mPageSize < MAX_PAGE_SIZE) { mPageSize = min(MAX_PAGE_SIZE, mPageSize * 2); mPageSize = ALIGN(mPageSize); } mWastedSpace += mPageSize; Page* p = newPage(mPageSize); if (mCurrentPage) { mCurrentPage->setNext(p); } mCurrentPage = p; if (!mPages) { mPages = mCurrentPage; } mNext = start(mCurrentPage); }
void* LinearAllocator::allocImpl(size_t size) { size = ALIGN(size); if (size > mMaxAllocSize && !fitsInCurrentPage(size)) { ALOGV("Exceeded max size %zu > %zu", size, mMaxAllocSize); // Allocation is too large, create a dedicated page for the allocation Page* page = newPage(size); mDedicatedPageCount++; page->setNext(mPages); mPages = page; if (!mCurrentPage) mCurrentPage = mPages; return start(page); } ensureNext(size); void* ptr = mNext; mNext = ((char*)mNext) + size; mWastedSpace -= size; return ptr; }