void cancelPendingItems();
- static void runCompletionCallbacks(
+protected:
+
+ void runCompletionCallbacks(
const v3s16 &pos, EmergeAction action,
const EmergeCallbackList &callbacks);
//// EmergeManager
////
-EmergeManager::EmergeManager(Server *server)
+EmergeManager::EmergeManager(Server *server, MetricsBackend *mb)
{
this->ndef = server->getNodeDefManager();
this->biomemgr = new BiomeManager(server);
enable_mapgen_debug_info = g_settings->getBool("enable_mapgen_debug_info");
+ STATIC_ASSERT(ARRLEN(emergeActionStrs) == ARRLEN(m_completed_emerge_counter),
+ enum_size_mismatches);
+ for (u32 i = 0; i < ARRLEN(m_completed_emerge_counter); i++) {
+ std::string help_str("Number of completed emerges with status ");
+ help_str.append(emergeActionStrs[i]);
+ m_completed_emerge_counter[i] = mb->addCounter(
+ "minetest_emerge_completed", help_str,
+ {{"status", emergeActionStrs[i]}}
+ );
+ }
+
s16 nthreads = 1;
g_settings->getS16NoEx("num_emerge_threads", nthreads);
// If automatic, leave a proc for the main thread and one for
// some other misc thread
- if (nthreads == 0)
+ if (nthreads <= 0)
nthreads = Thread::getNumberOfProcessors() - 2;
if (nthreads < 1)
nthreads = 1;
delete m_mapgens[i];
}
+ delete biomegen;
delete biomemgr;
delete oremgr;
delete decomgr;
//
-// TODO(hmmmm): Move this to ServerMap
-v3s16 EmergeManager::getContainingChunk(v3s16 blockpos)
-{
- return getContainingChunk(blockpos, mgparams->chunksize);
-}
-
// TODO(hmmmm): Move this to ServerMap
v3s16 EmergeManager::getContainingChunk(v3s16 blockpos, s16 chunksize)
{
}
-int EmergeManager::getGroundLevelAtPoint(v2s16 p)
-{
- if (m_mapgens.empty() || !m_mapgens[0]) {
- errorstream << "EmergeManager: getGroundLevelAtPoint() called"
- " before mapgen init" << std::endl;
- return 0;
- }
-
- return m_mapgens[0]->getGroundLevelAtPoint(p);
-}
-
// TODO(hmmmm): Move this to ServerMap
bool EmergeManager::isBlockUnderground(v3s16 blockpos)
{
return m_threads[index];
}
+void EmergeManager::reportCompletedEmerge(EmergeAction action)
+{
+ assert((size_t)action < ARRLEN(m_completed_emerge_counter));
+ m_completed_emerge_counter[(int)action]->increment();
+}
+
////
//// EmergeThread
void EmergeThread::runCompletionCallbacks(const v3s16 &pos, EmergeAction action,
const EmergeCallbackList &callbacks)
{
+ m_emerge->reportCompletedEmerge(action);
+
for (size_t i = 0; i != callbacks.size(); i++) {
EmergeCompletionCallback callback;
void *param;
// 1). Attempt to fetch block from memory
*block = m_map->getBlockNoCreateNoEx(pos);
- if (*block && !(*block)->isDummy()) {
+ if (*block) {
if ((*block)->isGenerated())
return EMERGE_FROM_MEMORY;
} else {
m_server->getScriptIface()->environment_OnGenerated(
minp, maxp, m_mapgen->blockseed);
} catch (LuaError &e) {
- m_server->setAsyncFatalError("Lua: finishGen" + std::string(e.what()));
+ m_server->setAsyncFatalError(e);
}
+ EMERGE_DBG_OUT("ended up with: " << analyze_block(block));
+
/*
- Clear generate notifier events
+ Clear mapgen state
*/
+ assert(!m_mapgen->generating);
m_mapgen->gennotify.clearEvents();
-
- EMERGE_DBG_OUT("ended up with: " << analyze_block(block));
+ m_mapgen->vm = nullptr;
/*
Activate the block
BEGIN_DEBUG_EXCEPTION_HANDLER
v3s16 pos;
+ std::map<v3s16, MapBlock *> modified_blocks;
- m_map = (ServerMap *)&(m_server->m_env->getMap());
+ m_map = &m_server->m_env->getServerMap();
m_emerge = m_server->m_emerge;
m_mapgen = m_emerge->m_mapgens[id];
enable_mapgen_debug_info = m_emerge->enable_mapgen_debug_info;
try {
while (!stopRequested()) {
- std::map<v3s16, MapBlock *> modified_blocks;
BlockEmergeData bedata;
BlockMakeData bmdata;
EmergeAction action;
- MapBlock *block;
+ MapBlock *block = nullptr;
if (!popBlockEmerge(&pos, &bedata)) {
m_queue_event.wait();
}
block = finishGen(pos, &bmdata, &modified_blocks);
+ if (!block)
+ action = EMERGE_ERRORED;
}
runCompletionCallbacks(pos, action, bedata.callbacks);
if (!modified_blocks.empty())
m_server->SetBlocksNotSent(modified_blocks);
+ modified_blocks.clear();
}
} catch (VersionMismatchException &e) {
std::ostringstream err;
m_server->setAsyncFatalError(err.str());
}
+ cancelPendingItems();
+
END_DEBUG_EXCEPTION_HANDLER
return NULL;
}