MapBlock * Map::getBlockBuffered(v3s16 & p) { MapBlock *block; { auto lock = try_shared_lock(m_block_cache_mutex); if(m_block_cache && p == m_block_cache_p) return m_block_cache; } // If block doesn't exist, return NULL { auto lock = m_blocks.lock_shared_rec(); auto n = m_blocks.find(p); if(n == m_blocks.end()) { block = NULL; } // If block exists, return it else{ block = n->second; } } // Cache the last result auto lock = unique_lock(m_block_cache_mutex); m_block_cache_p = p; m_block_cache = block; return block; }
//TODO: REMOVE THIS func and use Map::getBlock MapBlock* Map::getBlockNoCreateNoEx(v3POS p, bool trylock, bool nocache) { #ifndef NDEBUG ScopeProfiler sp(g_profiler, "Map: getBlock"); #endif #if !ENABLE_THREADS nocache = true; //very dirty hack. fix and remove. Also compare speed: no cache and cache with lock #endif if (!nocache) { #if ENABLE_THREADS && !HAVE_THREAD_LOCAL auto lock = try_shared_lock(m_block_cache_mutex, TRY_TO_LOCK); if(lock.owns_lock()) #endif if(m_block_cache && p == m_block_cache_p) { #ifndef NDEBUG g_profiler->add("Map: getBlock cache hit", 1); #endif return m_block_cache; } } MapBlockP block; { auto lock = trylock ? m_blocks.try_lock_shared_rec() : m_blocks.lock_shared_rec(); if (!lock->owns_lock()) return nullptr; auto n = m_blocks.find(p); if(n == m_blocks.end()) return nullptr; block = n->second; } if (!nocache) { #if ENABLE_THREADS && !HAVE_THREAD_LOCAL auto lock = unique_lock(m_block_cache_mutex, TRY_TO_LOCK); if(lock.owns_lock()) #endif { m_block_cache_p = p; m_block_cache = block; } } return block; }