Crash fix.

This commit is contained in:
David Williams 2014-09-17 21:04:47 +02:00
parent 37f1ddaed2
commit 98526d38d3

View File

@ -547,7 +547,8 @@ namespace PolyVox
// The block was found so we can use it. // The block was found so we can use it.
pUncompressedBlock = itUncompressedBlock->second; pUncompressedBlock = itUncompressedBlock->second;
} }
else
if (!pUncompressedBlock)
{ {
// There's some (slim) chance that it exists in the list of all blocks, because a sampler may be holding on to it. // There's some (slim) chance that it exists in the list of all blocks, because a sampler may be holding on to it.
typename WeakPtrBlockMap::iterator itWeakUncompressedBlock = m_pAllBlocks.find(v3dBlockPos); typename WeakPtrBlockMap::iterator itWeakUncompressedBlock = m_pAllBlocks.find(v3dBlockPos);
@ -564,32 +565,33 @@ namespace PolyVox
m_pAllBlocks.erase(itWeakUncompressedBlock); m_pAllBlocks.erase(itWeakUncompressedBlock);
} }
} }
else }
if (!pUncompressedBlock)
{
// The block was not found so we will create a new one.
pUncompressedBlock = std::make_shared< UncompressedBlock<VoxelType> >(v3dBlockPos, m_uBlockSideLength, m_pPager);
while (m_pRecentlyUsedBlocks.size() + 1 > m_uMaxNumberOfUncompressedBlocks) // +1 ready for new block we will add next.
{ {
// The block was not found so we will create a new one. // Find the least recently used block. Hopefully this isn't too slow.
pUncompressedBlock = std::make_shared< UncompressedBlock<VoxelType> >(v3dBlockPos, m_uBlockSideLength, m_pPager); typename SharedPtrBlockMap::iterator i;
typename SharedPtrBlockMap::iterator itUnloadBlock = m_pRecentlyUsedBlocks.begin();
while (m_pRecentlyUsedBlocks.size() + 1 > m_uMaxNumberOfUncompressedBlocks) // +1 ready for new block we will add next. for (i = m_pRecentlyUsedBlocks.begin(); i != m_pRecentlyUsedBlocks.end(); i++)
{ {
// Find the least recently used block. Hopefully this isn't too slow. if (i->second->m_uBlockLastAccessed < itUnloadBlock->second->m_uBlockLastAccessed)
typename SharedPtrBlockMap::iterator i;
typename SharedPtrBlockMap::iterator itUnloadBlock = m_pRecentlyUsedBlocks.begin();
for (i = m_pRecentlyUsedBlocks.begin(); i != m_pRecentlyUsedBlocks.end(); i++)
{ {
if (i->second->m_uBlockLastAccessed < itUnloadBlock->second->m_uBlockLastAccessed) itUnloadBlock = i;
{
itUnloadBlock = i;
}
} }
// Erase the least recently used block
eraseBlock(itUnloadBlock);
} }
// Add our new block to the map. // Erase the least recently used block
m_pAllBlocks.insert(std::make_pair(v3dBlockPos, pUncompressedBlock)); eraseBlock(itUnloadBlock);
m_pRecentlyUsedBlocks.insert(std::make_pair(v3dBlockPos, pUncompressedBlock));
} }
// Add our new block to the map.
m_pAllBlocks.insert(std::make_pair(v3dBlockPos, pUncompressedBlock));
m_pRecentlyUsedBlocks.insert(std::make_pair(v3dBlockPos, pUncompressedBlock));
} }
pUncompressedBlock->m_uBlockLastAccessed = ++m_uTimestamper; pUncompressedBlock->m_uBlockLastAccessed = ++m_uTimestamper;