diff options
Diffstat (limited to 'src/emerge.cpp')
-rw-r--r-- | src/emerge.cpp | 54 |
1 files changed, 29 insertions, 25 deletions
diff --git a/src/emerge.cpp b/src/emerge.cpp index 3e42742f6..28b286c24 100644 --- a/src/emerge.cpp +++ b/src/emerge.cpp @@ -592,18 +592,19 @@ bool EmergeThread::popBlockEmerge(v3s16 *pos, BlockEmergeData *bedata) EmergeAction EmergeThread::getBlockOrStartGen( const v3s16 &pos, bool allow_gen, MapBlock **block, BlockMakeData *bmdata) { - MutexAutoLock envlock(m_server->m_env_mutex); - // 1). Attempt to fetch block from memory *block = m_map->getBlockNoCreateNoEx(pos); + if (*block && !(*block)->isDummy()) { - if ((*block)->isGenerated()) + if ((*block)->isGenerated()) { return EMERGE_FROM_MEMORY; + } } else { // 2). Attempt to load block from disk if it was not in the memory *block = m_map->loadBlock(pos); - if (*block && (*block)->isGenerated()) + if (*block && (*block)->isGenerated()) { return EMERGE_FROM_DISK; + } } // 3). Attempt to start generation @@ -618,7 +619,6 @@ EmergeAction EmergeThread::getBlockOrStartGen( MapBlock *EmergeThread::finishGen(v3s16 pos, BlockMakeData *bmdata, std::map<v3s16, MapBlock *> *modified_blocks) { - MutexAutoLock envlock(m_server->m_env_mutex); ScopeProfiler sp(g_profiler, "EmergeThread: after Mapgen::makeChunk", SPT_AVG); @@ -697,34 +697,38 @@ void *EmergeThread::run() continue; } - if (blockpos_over_max_limit(pos)) - continue; + { + MutexAutoLock envlock(m_server->m_env_mutex); + if (blockpos_over_max_limit(pos)) + continue; + + bool allow_gen = bedata.flags & BLOCK_EMERGE_ALLOW_GEN; + EMERGE_DBG_OUT("pos=" PP(pos) " allow_gen=" << allow_gen); - bool allow_gen = bedata.flags & BLOCK_EMERGE_ALLOW_GEN; - EMERGE_DBG_OUT("pos=" PP(pos) " allow_gen=" << allow_gen); + action = getBlockOrStartGen(pos, allow_gen, &block, &bmdata); + if (action == EMERGE_GENERATED) { + { + ScopeProfiler sp(g_profiler, + "EmergeThread: Mapgen::makeChunk", SPT_AVG); - action = getBlockOrStartGen(pos, allow_gen, &block, &bmdata); - if (action == EMERGE_GENERATED) { - { - ScopeProfiler sp(g_profiler, - "EmergeThread: Mapgen::makeChunk", SPT_AVG); + m_mapgen->makeChunk(&bmdata); + } - m_mapgen->makeChunk(&bmdata); + block = finishGen(pos, &bmdata, &modified_blocks); + if (!block) + action = EMERGE_ERRORED; } - block = finishGen(pos, &bmdata, &modified_blocks); - if (!block) - action = EMERGE_ERRORED; - } + runCompletionCallbacks(pos, action, bedata.callbacks); - runCompletionCallbacks(pos, action, bedata.callbacks); + if (block) + modified_blocks[pos] = block; - if (block) - modified_blocks[pos] = block; + if (!modified_blocks.empty()) + m_server->SetBlocksNotSent(modified_blocks); - if (!modified_blocks.empty()) - m_server->SetBlocksNotSent(modified_blocks); - modified_blocks.clear(); + modified_blocks.clear(); + } } } catch (VersionMismatchException &e) { std::ostringstream err; |