Skip to content

Instantly share code, notes, and snippets.

@stoyannk
Created August 25, 2012 13:17
Show Gist options
  • Save stoyannk/3465535 to your computer and use it in GitHub Desktop.
Save stoyannk/3465535 to your computer and use it in GitHub Desktop.
AllocateFirstNodeOnPage
SMDataQueueBase::Node* SMDataQueueBase::AllocateFirstNodeOnPage(size_t size)
{
if(m_FreePages.empty())
{
// garbage collect
m_UsedPages.erase(std::remove_if(m_UsedPages.begin(), m_UsedPages.end(), [this](unsigned pageId) -> bool
{
const bool isFree = m_Pages[pageId]->NodesOwned == 0;
if (isFree)
{
m_FreePages.push_back(pageId);
}
return isFree;
}), m_UsedPages.end() );
}
unsigned freePage = MAX_SHARED_PAGES;
for(auto it = m_FreePages.begin(); it != m_FreePages.end(); ++it)
{
if(m_Pages[*it]->GetDataSize() >= size)
{
freePage = *it;
break;
}
}
if(freePage != MAX_SHARED_PAGES)
{
m_UsedPages.push_back(freePage);
m_FreePages.erase(m_FreePages.begin() + freePage);
}
else
{
AllocatePage(std::max(size*2, DEFAULT_PAGE_SIZE));
freePage = m_SharedData->m_AllocatedPagesCount - 1;
m_UsedPages.push_back(freePage);
}
Node* node = new (m_Pages[freePage]->GetData()) Node(size, freePage, 0);
m_Pages[freePage]->AddNode();
return node;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment