ossimRefPtr<ossimElevCellHandler> ossimElevationCellDatabase::getOrCreateCellHandler(const ossimGpt& gpt) { ossimRefPtr<ossimElevCellHandler> result = 0; ossim_uint64 id = createId(gpt); { OpenThreads::ScopedLock<OpenThreads::Mutex> lock(m_cacheMapMutex); CellMap::iterator iter = m_cacheMap.find(id); if(iter != m_cacheMap.end()) { iter->second->updateTimestamp(); result = iter->second->m_handler.get(); return result.get(); } } result = createCell(gpt); { OpenThreads::ScopedLock<OpenThreads::Mutex> lock(m_cacheMapMutex); if(result.valid()) { m_cacheMap.insert(std::make_pair(id, new CellInfo(id, result.get()))); // Check the map size and purge cells if needed. if(m_cacheMap.size() > m_maxOpenCells) { flushCacheToMinOpenCells(); } } } return result; }
ossimRefPtr<ossimElevCellHandler> ossimImageElevationDatabase::getOrCreateCellHandler( const ossimGpt& gpt) { ossimRefPtr<ossimElevCellHandler> result = 0; // Note: Must do mutex lock / unlock around any cach map access. m_cacheMapMutex.lock(); if ( m_cacheMap.size() ) { //--- // Look in existing map for handler. // // Note: Cannot key off of id from gpt as cells can be any arbituary dimensions. //--- CellMap::iterator lastAccessedCellIter = m_cacheMap.find(m_lastAccessedId); CellMap::iterator iter = lastAccessedCellIter; // Check from last accessed to end. while ( iter != m_cacheMap.end() ) { if ( iter->second->m_handler->pointHasCoverage(gpt) ) { result = iter->second->m_handler.get(); break; } ++iter; } if ( result.valid() == false ) { iter = m_cacheMap.begin(); // Beginning to last accessed. while ( iter != lastAccessedCellIter) { if ( iter->second->m_handler->pointHasCoverage(gpt) ) { result = iter->second->m_handler.get(); break; } ++iter; } } if ( result.valid() ) { m_lastAccessedId = iter->second->m_id; iter->second->updateTimestamp(); } } m_cacheMapMutex.unlock(); if ( result.valid() == false ) { // Not in m_cacheMap. Create a new cell for point if we have coverage. result = createCell(gpt); if(result.valid()) { OpenThreads::ScopedLock<OpenThreads::Mutex> lock(m_cacheMapMutex); //--- // Add the cell to map. // NOTE: ossimImageElevationDatabase::createCell sets m_lastAccessedId to that of // the entries map key. //--- m_cacheMap.insert(std::make_pair(m_lastAccessedId, new CellInfo(m_lastAccessedId, result.get()))); ++m_lastMapKey; // Check the map size and purge cells if needed. if(m_cacheMap.size() > m_maxOpenCells) { flushCacheToMinOpenCells(); } } } return result; }