Skip to content

Commit 3c65d1a

Browse files
sfan5nerzhul
authored andcommittedMay 5, 2020
Give the Mapgen on each EmergeThread its own Biome/Ore/Deco/SchemManager copy
1 parent 2062c80 commit 3c65d1a

27 files changed

+225
-77
lines changed
 

Diff for: ‎src/emerge.cpp

+58-2
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,28 @@ class MapEditEventAreaIgnorer
109109
VoxelArea *m_ignorevariable;
110110
};
111111

112+
EmergeParams::~EmergeParams()
113+
{
114+
infostream << "EmergeParams: destroying " << this << std::endl;
115+
// Delete everything that was cloned on creation of EmergeParams
116+
delete biomemgr;
117+
delete oremgr;
118+
delete decomgr;
119+
delete schemmgr;
120+
}
121+
122+
EmergeParams::EmergeParams(EmergeManager *parent, const BiomeManager *biomemgr,
123+
const OreManager *oremgr, const DecorationManager *decomgr,
124+
const SchematicManager *schemmgr) :
125+
ndef(parent->ndef),
126+
enable_mapgen_debug_info(parent->enable_mapgen_debug_info),
127+
gen_notify_on(parent->gen_notify_on),
128+
gen_notify_on_deco_ids(&parent->gen_notify_on_deco_ids),
129+
biomemgr(biomemgr->clone()), oremgr(oremgr->clone()),
130+
decomgr(decomgr->clone()), schemmgr(schemmgr->clone())
131+
{
132+
}
133+
112134
////
113135
//// EmergeManager
114136
////
@@ -182,14 +204,48 @@ EmergeManager::~EmergeManager()
182204
}
183205

184206

207+
BiomeManager *EmergeManager::getWritableBiomeManager()
208+
{
209+
FATAL_ERROR_IF(!m_mapgens.empty(),
210+
"Writable managers can only be returned before mapgen init");
211+
return biomemgr;
212+
}
213+
214+
OreManager *EmergeManager::getWritableOreManager()
215+
{
216+
FATAL_ERROR_IF(!m_mapgens.empty(),
217+
"Writable managers can only be returned before mapgen init");
218+
return oremgr;
219+
}
220+
221+
DecorationManager *EmergeManager::getWritableDecorationManager()
222+
{
223+
FATAL_ERROR_IF(!m_mapgens.empty(),
224+
"Writable managers can only be returned before mapgen init");
225+
return decomgr;
226+
}
227+
228+
SchematicManager *EmergeManager::getWritableSchematicManager()
229+
{
230+
FATAL_ERROR_IF(!m_mapgens.empty(),
231+
"Writable managers can only be returned before mapgen init");
232+
return schemmgr;
233+
}
234+
235+
185236
void EmergeManager::initMapgens(MapgenParams *params)
186237
{
187238
FATAL_ERROR_IF(!m_mapgens.empty(), "Mapgen already initialised.");
188239

189240
mgparams = params;
190241

191-
for (u32 i = 0; i != m_threads.size(); i++)
192-
m_mapgens.push_back(Mapgen::createMapgen(params->mgtype, params, this));
242+
for (u32 i = 0; i != m_threads.size(); i++) {
243+
EmergeParams *p = new EmergeParams(
244+
this, biomemgr, oremgr, decomgr, schemmgr);
245+
infostream << "EmergeManager: Created params " << p
246+
<< " for thread " << i << std::endl;
247+
m_mapgens.push_back(Mapgen::createMapgen(params->mgtype, params, p));
248+
}
193249
}
194250

195251

Diff for: ‎src/emerge.h

+42-6
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,30 @@ struct BlockEmergeData {
8686
EmergeCallbackList callbacks;
8787
};
8888

89+
class EmergeParams {
90+
friend class EmergeManager;
91+
public:
92+
EmergeParams() = delete;
93+
~EmergeParams();
94+
DISABLE_CLASS_COPY(EmergeParams);
95+
96+
const NodeDefManager *ndef; // shared
97+
bool enable_mapgen_debug_info;
98+
99+
u32 gen_notify_on;
100+
const std::set<u32> *gen_notify_on_deco_ids; // shared
101+
102+
BiomeManager *biomemgr;
103+
OreManager *oremgr;
104+
DecorationManager *decomgr;
105+
SchematicManager *schemmgr;
106+
107+
private:
108+
EmergeParams(EmergeManager *parent, const BiomeManager *biomemgr,
109+
const OreManager *oremgr, const DecorationManager *decomgr,
110+
const SchematicManager *schemmgr);
111+
};
112+
89113
class EmergeManager {
90114
public:
91115
const NodeDefManager *ndef;
@@ -106,17 +130,22 @@ class EmergeManager {
106130
// Environment is not created until after script initialization.
107131
MapSettingsManager *map_settings_mgr;
108132

109-
// Managers of various map generation-related components
110-
BiomeManager *biomemgr;
111-
OreManager *oremgr;
112-
DecorationManager *decomgr;
113-
SchematicManager *schemmgr;
114-
115133
// Methods
116134
EmergeManager(Server *server);
117135
~EmergeManager();
118136
DISABLE_CLASS_COPY(EmergeManager);
119137

138+
// no usage restrictions
139+
const BiomeManager *getBiomeManager() const { return biomemgr; }
140+
const OreManager *getOreManager() const { return oremgr; }
141+
const DecorationManager *getDecorationManager() const { return decomgr; }
142+
const SchematicManager *getSchematicManager() const { return schemmgr; }
143+
// only usable before mapgen init
144+
BiomeManager *getWritableBiomeManager();
145+
OreManager *getWritableOreManager();
146+
DecorationManager *getWritableDecorationManager();
147+
SchematicManager *getWritableSchematicManager();
148+
120149
void initMapgens(MapgenParams *mgparams);
121150

122151
void startThreads();
@@ -160,6 +189,13 @@ class EmergeManager {
160189
u16 m_qlimit_diskonly;
161190
u16 m_qlimit_generate;
162191

192+
// Managers of various map generation-related components
193+
// Note that each Mapgen gets a copy(!) of these to work with
194+
BiomeManager *biomemgr;
195+
OreManager *oremgr;
196+
DecorationManager *decomgr;
197+
SchematicManager *schemmgr;
198+
163199
// Requires m_queue_mutex held
164200
EmergeThread *getOptimalThread();
165201

Diff for: ‎src/mapgen/mapgen.cpp

+10-7
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ STATIC_ASSERT(
106106
//// Mapgen
107107
////
108108

109-
Mapgen::Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge) :
110-
gennotify(emerge->gen_notify_on, &emerge->gen_notify_on_deco_ids)
109+
Mapgen::Mapgen(int mapgenid, MapgenParams *params, EmergeParams *emerge) :
110+
gennotify(emerge->gen_notify_on, emerge->gen_notify_on_deco_ids)
111111
{
112112
id = mapgenid;
113113
water_level = params->water_level;
@@ -156,7 +156,7 @@ const char *Mapgen::getMapgenName(MapgenType mgtype)
156156

157157

158158
Mapgen *Mapgen::createMapgen(MapgenType mgtype, MapgenParams *params,
159-
EmergeManager *emerge)
159+
EmergeParams *emerge)
160160
{
161161
switch (mgtype) {
162162
case MAPGEN_CARPATHIAN:
@@ -585,7 +585,7 @@ void Mapgen::spreadLight(const v3s16 &nmin, const v3s16 &nmax)
585585
//// MapgenBasic
586586
////
587587

588-
MapgenBasic::MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emerge)
588+
MapgenBasic::MapgenBasic(int mapgenid, MapgenParams *params, EmergeParams *emerge)
589589
: Mapgen(mapgenid, params, emerge)
590590
{
591591
this->m_emerge = emerge;
@@ -642,6 +642,8 @@ MapgenBasic::~MapgenBasic()
642642
{
643643
delete biomegen;
644644
delete []heightmap;
645+
646+
delete m_emerge; // destroying EmergeParams is our responsibility
645647
}
646648

647649

@@ -974,7 +976,7 @@ void MapgenBasic::generateDungeons(s16 max_stone_y)
974976
////
975977

976978
GenerateNotifier::GenerateNotifier(u32 notify_on,
977-
std::set<u32> *notify_on_deco_ids)
979+
const std::set<u32> *notify_on_deco_ids)
978980
{
979981
m_notify_on = notify_on;
980982
m_notify_on_deco_ids = notify_on_deco_ids;
@@ -987,7 +989,8 @@ void GenerateNotifier::setNotifyOn(u32 notify_on)
987989
}
988990

989991

990-
void GenerateNotifier::setNotifyOnDecoIds(std::set<u32> *notify_on_deco_ids)
992+
void GenerateNotifier::setNotifyOnDecoIds(
993+
const std::set<u32> *notify_on_deco_ids)
991994
{
992995
m_notify_on_deco_ids = notify_on_deco_ids;
993996
}
@@ -999,7 +1002,7 @@ bool GenerateNotifier::addEvent(GenNotifyType type, v3s16 pos, u32 id)
9991002
return false;
10001003

10011004
if (type == GENNOTIFY_DECORATION &&
1002-
m_notify_on_deco_ids->find(id) == m_notify_on_deco_ids->end())
1005+
m_notify_on_deco_ids->find(id) == m_notify_on_deco_ids->cend())
10031006
return false;
10041007

10051008
GenNotifyEvent gne;

Diff for: ‎src/mapgen/mapgen.h

+8-7
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class Biome;
5151
class BiomeGen;
5252
struct BiomeParams;
5353
class BiomeManager;
54+
class EmergeParams;
5455
class EmergeManager;
5556
class MapBlock;
5657
class VoxelManipulator;
@@ -87,18 +88,18 @@ struct GenNotifyEvent {
8788
class GenerateNotifier {
8889
public:
8990
GenerateNotifier() = default;
90-
GenerateNotifier(u32 notify_on, std::set<u32> *notify_on_deco_ids);
91+
GenerateNotifier(u32 notify_on, const std::set<u32> *notify_on_deco_ids);
9192

9293
void setNotifyOn(u32 notify_on);
93-
void setNotifyOnDecoIds(std::set<u32> *notify_on_deco_ids);
94+
void setNotifyOnDecoIds(const std::set<u32> *notify_on_deco_ids);
9495

9596
bool addEvent(GenNotifyType type, v3s16 pos, u32 id=0);
9697
void getEvents(std::map<std::string, std::vector<v3s16> > &event_map);
9798
void clearEvents();
9899

99100
private:
100101
u32 m_notify_on = 0;
101-
std::set<u32> *m_notify_on_deco_ids;
102+
const std::set<u32> *m_notify_on_deco_ids;
102103
std::list<GenNotifyEvent> m_notify_events;
103104
};
104105

@@ -176,7 +177,7 @@ class Mapgen {
176177
GenerateNotifier gennotify;
177178

178179
Mapgen() = default;
179-
Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge);
180+
Mapgen(int mapgenid, MapgenParams *params, EmergeParams *emerge);
180181
virtual ~Mapgen() = default;
181182
DISABLE_CLASS_COPY(Mapgen);
182183

@@ -215,7 +216,7 @@ class Mapgen {
215216
static MapgenType getMapgenType(const std::string &mgname);
216217
static const char *getMapgenName(MapgenType mgtype);
217218
static Mapgen *createMapgen(MapgenType mgtype, MapgenParams *params,
218-
EmergeManager *emerge);
219+
EmergeParams *emerge);
219220
static MapgenParams *createMapgenParams(MapgenType mgtype);
220221
static void getMapgenNames(std::vector<const char *> *mgnames, bool include_hidden);
221222
static void setDefaultSettings(Settings *settings);
@@ -243,7 +244,7 @@ class Mapgen {
243244
*/
244245
class MapgenBasic : public Mapgen {
245246
public:
246-
MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emerge);
247+
MapgenBasic(int mapgenid, MapgenParams *params, EmergeParams *emerge);
247248
virtual ~MapgenBasic();
248249

249250
virtual void generateBiomes();
@@ -254,7 +255,7 @@ class MapgenBasic : public Mapgen {
254255
virtual void generateDungeons(s16 max_stone_y);
255256

256257
protected:
257-
EmergeManager *m_emerge;
258+
EmergeParams *m_emerge;
258259
BiomeManager *m_bmgr;
259260

260261
Noise *noise_filler_depth;

Diff for: ‎src/mapgen/mapgen_carpathian.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ FlagDesc flagdesc_mapgen_carpathian[] = {
4949
///////////////////////////////////////////////////////////////////////////////
5050

5151

52-
MapgenCarpathian::MapgenCarpathian(MapgenCarpathianParams *params, EmergeManager *emerge)
52+
MapgenCarpathian::MapgenCarpathian(MapgenCarpathianParams *params, EmergeParams *emerge)
5353
: MapgenBasic(MAPGEN_CARPATHIAN, params, emerge)
5454
{
5555
base_level = params->base_level;

Diff for: ‎src/mapgen/mapgen_carpathian.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ struct MapgenCarpathianParams : public MapgenParams
7979
class MapgenCarpathian : public MapgenBasic
8080
{
8181
public:
82-
MapgenCarpathian(MapgenCarpathianParams *params, EmergeManager *emerge);
82+
MapgenCarpathian(MapgenCarpathianParams *params, EmergeParams *emerge);
8383
~MapgenCarpathian();
8484

8585
virtual MapgenType getType() const { return MAPGEN_CARPATHIAN; }

Diff for: ‎src/mapgen/mapgen_flat.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ FlagDesc flagdesc_mapgen_flat[] = {
4747
///////////////////////////////////////////////////////////////////////////////////////
4848

4949

50-
MapgenFlat::MapgenFlat(MapgenFlatParams *params, EmergeManager *emerge)
50+
MapgenFlat::MapgenFlat(MapgenFlatParams *params, EmergeParams *emerge)
5151
: MapgenBasic(MAPGEN_FLAT, params, emerge)
5252
{
5353
spflags = params->spflags;

Diff for: ‎src/mapgen/mapgen_flat.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ struct MapgenFlatParams : public MapgenParams
6464
class MapgenFlat : public MapgenBasic
6565
{
6666
public:
67-
MapgenFlat(MapgenFlatParams *params, EmergeManager *emerge);
67+
MapgenFlat(MapgenFlatParams *params, EmergeParams *emerge);
6868
~MapgenFlat();
6969

7070
virtual MapgenType getType() const { return MAPGEN_FLAT; }

Diff for: ‎src/mapgen/mapgen_fractal.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ FlagDesc flagdesc_mapgen_fractal[] = {
4747
///////////////////////////////////////////////////////////////////////////////////////
4848

4949

50-
MapgenFractal::MapgenFractal(MapgenFractalParams *params, EmergeManager *emerge)
50+
MapgenFractal::MapgenFractal(MapgenFractalParams *params, EmergeParams *emerge)
5151
: MapgenBasic(MAPGEN_FRACTAL, params, emerge)
5252
{
5353
spflags = params->spflags;

Diff for: ‎src/mapgen/mapgen_fractal.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ struct MapgenFractalParams : public MapgenParams
7272
class MapgenFractal : public MapgenBasic
7373
{
7474
public:
75-
MapgenFractal(MapgenFractalParams *params, EmergeManager *emerge);
75+
MapgenFractal(MapgenFractalParams *params, EmergeParams *emerge);
7676
~MapgenFractal();
7777

7878
virtual MapgenType getType() const { return MAPGEN_FRACTAL; }

Diff for: ‎src/mapgen/mapgen_singlenode.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2929
#include "emerge.h"
3030

3131

32-
MapgenSinglenode::MapgenSinglenode(MapgenParams *params, EmergeManager *emerge)
32+
MapgenSinglenode::MapgenSinglenode(MapgenParams *params, EmergeParams *emerge)
3333
: Mapgen(MAPGEN_SINGLENODE, params, emerge)
3434
{
3535
const NodeDefManager *ndef = emerge->ndef;

Diff for: ‎src/mapgen/mapgen_singlenode.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class MapgenSinglenode : public Mapgen
3838
content_t c_node;
3939
u8 set_light;
4040

41-
MapgenSinglenode(MapgenParams *params, EmergeManager *emerge);
41+
MapgenSinglenode(MapgenParams *params, EmergeParams *emerge);
4242
~MapgenSinglenode() = default;
4343

4444
virtual MapgenType getType() const { return MAPGEN_SINGLENODE; }

Diff for: ‎src/mapgen/mapgen_v5.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ FlagDesc flagdesc_mapgen_v5[] = {
4444
};
4545

4646

47-
MapgenV5::MapgenV5(MapgenV5Params *params, EmergeManager *emerge)
47+
MapgenV5::MapgenV5(MapgenV5Params *params, EmergeParams *emerge)
4848
: MapgenBasic(MAPGEN_V5, params, emerge)
4949
{
5050
spflags = params->spflags;

Diff for: ‎src/mapgen/mapgen_v5.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ struct MapgenV5Params : public MapgenParams
6464
class MapgenV5 : public MapgenBasic
6565
{
6666
public:
67-
MapgenV5(MapgenV5Params *params, EmergeManager *emerge);
67+
MapgenV5(MapgenV5Params *params, EmergeParams *emerge);
6868
~MapgenV5();
6969

7070
virtual MapgenType getType() const { return MAPGEN_V5; }

Diff for: ‎src/mapgen/mapgen_v6.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ FlagDesc flagdesc_mapgen_v6[] = {
5454
/////////////////////////////////////////////////////////////////////////////
5555

5656

57-
MapgenV6::MapgenV6(MapgenV6Params *params, EmergeManager *emerge)
57+
MapgenV6::MapgenV6(MapgenV6Params *params, EmergeParams *emerge)
5858
: Mapgen(MAPGEN_V6, params, emerge)
5959
{
6060
m_emerge = emerge;
@@ -160,6 +160,8 @@ MapgenV6::~MapgenV6()
160160
delete noise_humidity;
161161

162162
delete[] heightmap;
163+
164+
delete m_emerge; // our responsibility
163165
}
164166

165167

0 commit comments

Comments
 (0)
Please sign in to comment.