aboutsummaryrefslogtreecommitdiff
path: root/src/emerge.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emerge.cpp')
-rw-r--r--src/emerge.cpp54
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;