summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars <larsh@apache.org>2020-11-15 22:58:57 -0800
committerlhofhansl <larsh@apache.org>2020-11-26 20:31:20 -0800
commitf1d72d212a0661588be27003069abf4bd8092e55 (patch)
tree86de402f9f11ab96af7b6d37ebbfe3c539226487
parent9bb381ebd387cd783da8d582949bf284a29d9b3a (diff)
downloadminetest-f1d72d212a0661588be27003069abf4bd8092e55.tar.gz
minetest-f1d72d212a0661588be27003069abf4bd8092e55.tar.bz2
minetest-f1d72d212a0661588be27003069abf4bd8092e55.zip
Avoid generating the same chunk more than once with multiple emerge threads.
-rw-r--r--src/emerge.h1
-rw-r--r--src/map.cpp5
-rw-r--r--src/map.h1
-rw-r--r--src/mapgen/mapgen_carpathian.cpp6
-rw-r--r--src/mapgen/mapgen_flat.cpp6
-rw-r--r--src/mapgen/mapgen_fractal.cpp6
-rw-r--r--src/mapgen/mapgen_singlenode.cpp6
-rw-r--r--src/mapgen/mapgen_v5.cpp6
-rw-r--r--src/mapgen/mapgen_v6.cpp6
-rw-r--r--src/mapgen/mapgen_v7.cpp6
-rw-r--r--src/mapgen/mapgen_valleys.cpp6
11 files changed, 5 insertions, 50 deletions
diff --git a/src/emerge.h b/src/emerge.h
index 6f204666d..da845e243 100644
--- a/src/emerge.h
+++ b/src/emerge.h
@@ -52,7 +52,6 @@ struct BlockMakeData {
u64 seed = 0;
v3s16 blockpos_min;
v3s16 blockpos_max;
- v3s16 blockpos_requested;
UniqueQueue<v3s16> transforming_liquid;
const NodeDefManager *nodedef = nullptr;
diff --git a/src/map.cpp b/src/map.cpp
index ef7eddb39..37b6e9b6b 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -1345,6 +1345,9 @@ bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data)
v3s16 bpmin = EmergeManager::getContainingChunk(blockpos, csize);
v3s16 bpmax = bpmin + v3s16(1, 1, 1) * (csize - 1);
+ if (!m_chunks_in_progress.insert(bpmin).second)
+ return false;
+
bool enable_mapgen_debug_info = m_emerge->enable_mapgen_debug_info;
EMERGE_DBG_OUT("initBlockMake(): " PP(bpmin) " - " PP(bpmax));
@@ -1360,7 +1363,6 @@ bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data)
data->seed = getSeed();
data->blockpos_min = bpmin;
data->blockpos_max = bpmax;
- data->blockpos_requested = blockpos;
data->nodedef = m_nodedef;
/*
@@ -1482,6 +1484,7 @@ void ServerMap::finishBlockMake(BlockMakeData *data,
NOTE: Will be saved later.
*/
//save(MOD_STATE_WRITE_AT_UNLOAD);
+ m_chunks_in_progress.erase(bpmin);
}
MapSector *ServerMap::createSector(v2s16 p2d)
diff --git a/src/map.h b/src/map.h
index b28f34db3..3bc30c482 100644
--- a/src/map.h
+++ b/src/map.h
@@ -423,6 +423,7 @@ private:
// Chunks
core::map<v2s16, MapChunk*> m_chunks;
#endif
+ std::set<v3s16> m_chunks_in_progress;
/*
Metadata is re-written on disk only if this is true.
diff --git a/src/mapgen/mapgen_carpathian.cpp b/src/mapgen/mapgen_carpathian.cpp
index 74ed263ba..b3a0bd270 100644
--- a/src/mapgen/mapgen_carpathian.cpp
+++ b/src/mapgen/mapgen_carpathian.cpp
@@ -260,12 +260,6 @@ void MapgenCarpathian::makeChunk(BlockMakeData *data)
// Pre-conditions
assert(data->vmanip);
assert(data->nodedef);
- assert(data->blockpos_requested.X >= data->blockpos_min.X &&
- data->blockpos_requested.Y >= data->blockpos_min.Y &&
- data->blockpos_requested.Z >= data->blockpos_min.Z);
- assert(data->blockpos_requested.X <= data->blockpos_max.X &&
- data->blockpos_requested.Y <= data->blockpos_max.Y &&
- data->blockpos_requested.Z <= data->blockpos_max.Z);
this->generating = true;
this->vm = data->vmanip;
diff --git a/src/mapgen/mapgen_flat.cpp b/src/mapgen/mapgen_flat.cpp
index d62548014..342455029 100644
--- a/src/mapgen/mapgen_flat.cpp
+++ b/src/mapgen/mapgen_flat.cpp
@@ -209,12 +209,6 @@ void MapgenFlat::makeChunk(BlockMakeData *data)
// Pre-conditions
assert(data->vmanip);
assert(data->nodedef);
- assert(data->blockpos_requested.X >= data->blockpos_min.X &&
- data->blockpos_requested.Y >= data->blockpos_min.Y &&
- data->blockpos_requested.Z >= data->blockpos_min.Z);
- assert(data->blockpos_requested.X <= data->blockpos_max.X &&
- data->blockpos_requested.Y <= data->blockpos_max.Y &&
- data->blockpos_requested.Z <= data->blockpos_max.Z);
this->generating = true;
this->vm = data->vmanip;
diff --git a/src/mapgen/mapgen_fractal.cpp b/src/mapgen/mapgen_fractal.cpp
index 3b6bbd6c1..fabb1b2b1 100644
--- a/src/mapgen/mapgen_fractal.cpp
+++ b/src/mapgen/mapgen_fractal.cpp
@@ -209,12 +209,6 @@ void MapgenFractal::makeChunk(BlockMakeData *data)
// Pre-conditions
assert(data->vmanip);
assert(data->nodedef);
- assert(data->blockpos_requested.X >= data->blockpos_min.X &&
- data->blockpos_requested.Y >= data->blockpos_min.Y &&
- data->blockpos_requested.Z >= data->blockpos_min.Z);
- assert(data->blockpos_requested.X <= data->blockpos_max.X &&
- data->blockpos_requested.Y <= data->blockpos_max.Y &&
- data->blockpos_requested.Z <= data->blockpos_max.Z);
//TimeTaker t("makeChunk");
diff --git a/src/mapgen/mapgen_singlenode.cpp b/src/mapgen/mapgen_singlenode.cpp
index cade9e7a8..5382423fa 100644
--- a/src/mapgen/mapgen_singlenode.cpp
+++ b/src/mapgen/mapgen_singlenode.cpp
@@ -50,12 +50,6 @@ void MapgenSinglenode::makeChunk(BlockMakeData *data)
// Pre-conditions
assert(data->vmanip);
assert(data->nodedef);
- assert(data->blockpos_requested.X >= data->blockpos_min.X &&
- data->blockpos_requested.Y >= data->blockpos_min.Y &&
- data->blockpos_requested.Z >= data->blockpos_min.Z);
- assert(data->blockpos_requested.X <= data->blockpos_max.X &&
- data->blockpos_requested.Y <= data->blockpos_max.Y &&
- data->blockpos_requested.Z <= data->blockpos_max.Z);
this->generating = true;
this->vm = data->vmanip;
diff --git a/src/mapgen/mapgen_v5.cpp b/src/mapgen/mapgen_v5.cpp
index 0f6a19fa1..87e54755f 100644
--- a/src/mapgen/mapgen_v5.cpp
+++ b/src/mapgen/mapgen_v5.cpp
@@ -201,12 +201,6 @@ void MapgenV5::makeChunk(BlockMakeData *data)
// Pre-conditions
assert(data->vmanip);
assert(data->nodedef);
- assert(data->blockpos_requested.X >= data->blockpos_min.X &&
- data->blockpos_requested.Y >= data->blockpos_min.Y &&
- data->blockpos_requested.Z >= data->blockpos_min.Z);
- assert(data->blockpos_requested.X <= data->blockpos_max.X &&
- data->blockpos_requested.Y <= data->blockpos_max.Y &&
- data->blockpos_requested.Z <= data->blockpos_max.Z);
this->generating = true;
this->vm = data->vmanip;
diff --git a/src/mapgen/mapgen_v6.cpp b/src/mapgen/mapgen_v6.cpp
index 90a52e031..e04180f96 100644
--- a/src/mapgen/mapgen_v6.cpp
+++ b/src/mapgen/mapgen_v6.cpp
@@ -512,12 +512,6 @@ void MapgenV6::makeChunk(BlockMakeData *data)
// Pre-conditions
assert(data->vmanip);
assert(data->nodedef);
- assert(data->blockpos_requested.X >= data->blockpos_min.X &&
- data->blockpos_requested.Y >= data->blockpos_min.Y &&
- data->blockpos_requested.Z >= data->blockpos_min.Z);
- assert(data->blockpos_requested.X <= data->blockpos_max.X &&
- data->blockpos_requested.Y <= data->blockpos_max.Y &&
- data->blockpos_requested.Z <= data->blockpos_max.Z);
this->generating = true;
this->vm = data->vmanip;
diff --git a/src/mapgen/mapgen_v7.cpp b/src/mapgen/mapgen_v7.cpp
index 6b0779e9f..cc5f5726d 100644
--- a/src/mapgen/mapgen_v7.cpp
+++ b/src/mapgen/mapgen_v7.cpp
@@ -317,12 +317,6 @@ void MapgenV7::makeChunk(BlockMakeData *data)
// Pre-conditions
assert(data->vmanip);
assert(data->nodedef);
- assert(data->blockpos_requested.X >= data->blockpos_min.X &&
- data->blockpos_requested.Y >= data->blockpos_min.Y &&
- data->blockpos_requested.Z >= data->blockpos_min.Z);
- assert(data->blockpos_requested.X <= data->blockpos_max.X &&
- data->blockpos_requested.Y <= data->blockpos_max.Y &&
- data->blockpos_requested.Z <= data->blockpos_max.Z);
//TimeTaker t("makeChunk");
diff --git a/src/mapgen/mapgen_valleys.cpp b/src/mapgen/mapgen_valleys.cpp
index d7b6f738f..c4234857e 100644
--- a/src/mapgen/mapgen_valleys.cpp
+++ b/src/mapgen/mapgen_valleys.cpp
@@ -210,12 +210,6 @@ void MapgenValleys::makeChunk(BlockMakeData *data)
// Pre-conditions
assert(data->vmanip);
assert(data->nodedef);
- assert(data->blockpos_requested.X >= data->blockpos_min.X &&
- data->blockpos_requested.Y >= data->blockpos_min.Y &&
- data->blockpos_requested.Z >= data->blockpos_min.Z);
- assert(data->blockpos_requested.X <= data->blockpos_max.X &&
- data->blockpos_requested.Y <= data->blockpos_max.Y &&
- data->blockpos_requested.Z <= data->blockpos_max.Z);
//TimeTaker t("makeChunk");