X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Femerge.cpp;h=0844707836ded07650d93ef4787acdffdb844d17;hb=2c637ce1c26145269b09c62afb451240a8def401;hp=a697bcb0750d33057e7046887e07f0ea11fd6216;hpb=0a299fd4e5dff20bb09f54f2329aedcc8d22ef9d;p=minetest.git diff --git a/src/emerge.cpp b/src/emerge.cpp index a697bcb07..084470783 100644 --- a/src/emerge.cpp +++ b/src/emerge.cpp @@ -23,12 +23,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "server.h" #include #include -#include "jthread/jevent.h" +#include "threading/event.h" #include "map.h" #include "environment.h" #include "util/container.h" #include "util/thread.h" -#include "main.h" #include "constants.h" #include "voxel.h" #include "config.h" @@ -60,7 +59,7 @@ MapgenDesc reg_mapgens[] = { {"singlenode", new MapgenFactorySinglenode}, }; -class EmergeThread : public JThread +class EmergeThread : public Thread { public: Server *m_server; @@ -74,7 +73,6 @@ class EmergeThread : public JThread std::queue blockqueue; EmergeThread(Server *server, int ethreadid): - JThread(), m_server(server), map(NULL), emerge(NULL), @@ -82,9 +80,10 @@ class EmergeThread : public JThread enable_mapgen_debug_info(false), id(ethreadid) { + name = "Emerge-" + itos(id); } - void *Thread(); + void *run(); bool popBlockEmerge(v3s16 *pos, u8 *flags); bool getBlockOrStartGen(v3s16 p, MapBlock **b, BlockMakeData *data, bool allow_generate); @@ -113,7 +112,7 @@ EmergeManager::EmergeManager(IGameDef *gamedef) // some other misc thread s16 nthreads = 0; if (!g_settings->getS16NoEx("num_emerge_threads", nthreads)) - nthreads = porting::getNumberOfProcessors() - 2; + nthreads = Thread::getNumberOfProcessors() - 2; if (nthreads < 1) nthreads = 1; @@ -142,9 +141,9 @@ EmergeManager::~EmergeManager() { for (u32 i = 0; i != emergethread.size(); i++) { if (threads_active) { - emergethread[i]->Stop(); + emergethread[i]->stop(); emergethread[i]->qevent.signal(); - emergethread[i]->Wait(); + emergethread[i]->wait(); } delete emergethread[i]; delete mapgen[i]; @@ -166,7 +165,7 @@ EmergeManager::~EmergeManager() void EmergeManager::loadMapgenParams() { - loadParamsFromSettings(g_settings); + params.load(*g_settings); } @@ -197,7 +196,7 @@ void EmergeManager::initMapgens() Mapgen *EmergeManager::getCurrentMapgen() { for (u32 i = 0; i != emergethread.size(); i++) { - if (emergethread[i]->IsSameThread()) + if (emergethread[i]->isSameThread()) return emergethread[i]->mapgen; } @@ -211,7 +210,7 @@ void EmergeManager::startThreads() return; for (u32 i = 0; i != emergethread.size(); i++) - emergethread[i]->Start(); + emergethread[i]->start(); threads_active = true; } @@ -224,13 +223,13 @@ void EmergeManager::stopThreads() // Request thread stop in parallel for (u32 i = 0; i != emergethread.size(); i++) { - emergethread[i]->Stop(); + emergethread[i]->stop(); emergethread[i]->qevent.signal(); } // Then do the waiting for each for (u32 i = 0; i != emergethread.size(); i++) - emergethread[i]->Wait(); + emergethread[i]->wait(); threads_active = false; } @@ -248,7 +247,7 @@ bool EmergeManager::enqueueBlockEmerge(u16 peer_id, v3s16 p, bool allow_generate flags |= BLOCK_EMERGE_ALLOWGEN; { - JMutexAutoLock queuelock(queuemutex); + MutexAutoLock queuelock(queuemutex); count = blocks_enqueued.size(); if (count >= qlimit_total) @@ -344,9 +343,9 @@ Mapgen *EmergeManager::createMapgen(const std::string &mgname, int mgid, MapgenSpecificParams *EmergeManager::createMapgenParams(const std::string &mgname) { u32 i; - for (i = 0; i != ARRLEN(reg_mapgens) && mgname != reg_mapgens[i].name; i++); + for (i = 0; i < ARRLEN(reg_mapgens) && mgname != reg_mapgens[i].name; i++); if (i == ARRLEN(reg_mapgens)) { - errorstream << "EmergeManager; mapgen " << mgname << + errorstream << "EmergeManager: Mapgen " << mgname << " not registered" << std::endl; return NULL; } @@ -356,62 +355,12 @@ MapgenSpecificParams *EmergeManager::createMapgenParams(const std::string &mgnam } -void EmergeManager::loadParamsFromSettings(Settings *settings) -{ - std::string seed_str; - const char *setname = (settings == g_settings) ? "fixed_map_seed" : "seed"; - - if (!settings->getNoEx("seed", seed_str)) { - g_settings->getNoEx(setname, seed_str); - } - if (!seed_str.empty()) { - params.seed = read_seed(seed_str.c_str()); - } else { - params.seed = - ((u64)(myrand() & 0xffff) << 0) | - ((u64)(myrand() & 0xffff) << 16) | - ((u64)(myrand() & 0xffff) << 32) | - ((u64)(myrand() & 0xffff) << 48); - } - - settings->getNoEx("mg_name", params.mg_name); - settings->getS16NoEx("water_level", params.water_level); - settings->getS16NoEx("chunksize", params.chunksize); - settings->getFlagStrNoEx("mg_flags", params.flags, flagdesc_mapgen); - settings->getNoiseParams("mg_biome_np_heat", params.np_biome_heat); - settings->getNoiseParams("mg_biome_np_humidity", params.np_biome_humidity); - - delete params.sparams; - params.sparams = createMapgenParams(params.mg_name); - - if (params.sparams) { - params.sparams->readParams(g_settings); - params.sparams->readParams(settings); - } -} - - -void EmergeManager::saveParamsToSettings(Settings *settings) -{ - settings->set("mg_name", params.mg_name); - settings->setU64("seed", params.seed); - settings->setS16("water_level", params.water_level); - settings->setS16("chunksize", params.chunksize); - settings->setFlagStr("mg_flags", params.flags, flagdesc_mapgen, (u32)-1); - settings->setNoiseParams("mg_biome_np_heat", params.np_biome_heat); - settings->setNoiseParams("mg_biome_np_humidity", params.np_biome_humidity); - - if (params.sparams) - params.sparams->writeParams(settings); -} - - ////////////////////////////// Emerge Thread ////////////////////////////////// bool EmergeThread::popBlockEmerge(v3s16 *pos, u8 *flags) { std::map::iterator iter; - JMutexAutoLock queuelock(emerge->queuemutex); + MutexAutoLock queuelock(emerge->queuemutex); if (blockqueue.empty()) return false; @@ -441,7 +390,7 @@ bool EmergeThread::getBlockOrStartGen(v3s16 p, MapBlock **b, { v2s16 p2d(p.X, p.Z); //envlock: usually takes <=1ms, sometimes 90ms or ~400ms to acquire - JMutexAutoLock envlock(m_server->m_env_mutex); + MutexAutoLock envlock(m_server->m_env_mutex); // Load sector if it isn't loaded if (map->getSectorNoGenerateNoEx(p2d) == NULL) @@ -469,10 +418,8 @@ bool EmergeThread::getBlockOrStartGen(v3s16 p, MapBlock **b, } -void *EmergeThread::Thread() +void *EmergeThread::run() { - ThreadStarted(); - log_register_thread("EmergeThread" + itos(id)); DSTACK(__FUNCTION_NAME); BEGIN_DEBUG_EXCEPTION_HANDLER @@ -485,9 +432,7 @@ void *EmergeThread::Thread() mapgen = emerge->mapgen[id]; enable_mapgen_debug_info = emerge->mapgen_debug_info; - porting::setThreadName("EmergeThread"); - - while (!StopRequested()) + while (!stopRequested()) try { if (!popBlockEmerge(&p, &flags)) { qevent.wait(); @@ -522,7 +467,7 @@ void *EmergeThread::Thread() { //envlock: usually 0ms, but can take either 30 or 400ms to acquire - JMutexAutoLock envlock(m_server->m_env_mutex); + MutexAutoLock envlock(m_server->m_env_mutex); ScopeProfiler sp(g_profiler, "EmergeThread: after " "Mapgen::makeChunk (envlock)", SPT_AVG); @@ -545,8 +490,8 @@ void *EmergeThread::Thread() try { // takes about 90ms with -O1 on an e3-1230v2 m_server->getScriptIface()->environment_OnGenerated( minp, maxp, mapgen->blockseed); - } catch(LuaError &e) { - m_server->setAsyncFatalError(e.what()); + } catch (LuaError &e) { + m_server->setAsyncFatalError("Lua: " + std::string(e.what())); } EMERGE_DBG_OUT("ended up with: " << analyze_block(block)); @@ -569,25 +514,27 @@ void *EmergeThread::Thread() } catch (VersionMismatchException &e) { std::ostringstream err; - err << "World data version mismatch in MapBlock "<setAsyncFatalError(err.str()); } catch (SerializationError &e) { std::ostringstream err; - err << "Invalid data in MapBlock "<setAsyncFatalError(err.str()); } { - JMutexAutoLock queuelock(emerge->queuemutex); + MutexAutoLock queuelock(emerge->queuemutex); while (!blockqueue.empty()) { v3s16 p = blockqueue.front(); @@ -604,6 +551,5 @@ void *EmergeThread::Thread() } END_DEBUG_EXCEPTION_HANDLER(errorstream) - log_deregister_thread(); return NULL; }