-class EmergeThread : public SimpleThread
-{
-public:
- Server *m_server;
- ServerMap *map;
- EmergeManager *emerge;
- Mapgen *mapgen;
- bool enable_mapgen_debug_info;
- int id;
-
- Event qevent;
- std::queue<v3s16> blockqueue;
-
- EmergeThread(Server *server, int ethreadid):
- SimpleThread(),
- m_server(server),
- map(NULL),
- emerge(NULL),
- mapgen(NULL),
- id(ethreadid)
- {
- }
-
- void *Thread();
-
- void trigger()
- {
- setRun(true);
- if(IsRunning() == false)
- {
- Start();
- }
- }
-
- bool popBlockEmerge(v3s16 *pos, u8 *flags);
- bool getBlockOrStartGen(v3s16 p, MapBlock **b,
- BlockMakeData *data, bool allow_generate);
+ static MapgenFactory *getMapgenFactory(const std::string &mgname);
+ static void getMapgenNames(
+ std::vector<const char *> *mgnames, bool include_hidden);
+ static v3s16 getContainingChunk(v3s16 blockpos, s16 chunksize);
+
+private:
+ std::vector<Mapgen *> m_mapgens;
+ std::vector<EmergeThread *> m_threads;
+ bool m_threads_active;
+
+ Mutex m_queue_mutex;
+ std::map<v3s16, BlockEmergeData> m_blocks_enqueued;
+ std::map<u16, u16> m_peer_queue_count;
+
+ u16 m_qlimit_total;
+ u16 m_qlimit_diskonly;
+ u16 m_qlimit_generate;
+
+ // Requires m_queue_mutex held
+ EmergeThread *getOptimalThread();
+ bool pushBlockEmergeData(v3s16 pos, u16 peer_requested, u16 flags,
+ EmergeCompletionCallback callback, void *callback_param);
+ bool popBlockEmergeData(v3s16 pos, BlockEmergeData *bedata);
+
+ friend class EmergeThread;
+
+ DISABLE_CLASS_COPY(EmergeManager);