]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Avoid generating the same chunk more than once with multiple emerge threads.
authorLars <larsh@apache.org>
Mon, 16 Nov 2020 06:58:57 +0000 (22:58 -0800)
committerlhofhansl <larsh@apache.org>
Fri, 27 Nov 2020 04:31:20 +0000 (20:31 -0800)
src/emerge.h
src/map.cpp
src/map.h
src/mapgen/mapgen_carpathian.cpp
src/mapgen/mapgen_flat.cpp
src/mapgen/mapgen_fractal.cpp
src/mapgen/mapgen_singlenode.cpp
src/mapgen/mapgen_v5.cpp
src/mapgen/mapgen_v6.cpp
src/mapgen/mapgen_v7.cpp
src/mapgen/mapgen_valleys.cpp

index 6f204666df70776a69aea6aef2e4a41630ebe8ed..da845e243e917de66263eadb0f6a71c1a02563f5 100644 (file)
@@ -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;
 
index ef7eddb39ebd57f139dabe02c0f08f4c3c9821c6..37b6e9b6b89aa37f973f93aa8678c2ae95e44c00 100644 (file)
@@ -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)
index b28f34db30c75d7103d9b9ec9899fc7781da3451..3bc30c482a4634601dc863edbcf48353bc550927 100644 (file)
--- a/src/map.h
+++ b/src/map.h
@@ -423,6 +423,7 @@ class ServerMap : public Map
        // 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.
index 74ed263ba11ffcc278c567ddd02fcdafc8bf1944..b3a0bd270778e6cf07276bac45d0c97c2ceffc0d 100644 (file)
@@ -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;
index d62548014db8984cfc62f5408d3e94a810a17c48..342455029189871bf0ad56c94cd5cc488f8b350e 100644 (file)
@@ -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;
index 3b6bbd6c1633bc8a39dce958f9ca0bd37059813d..fabb1b2b197d7eb37b3022014fc7ecb6c21c247a 100644 (file)
@@ -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");
 
index cade9e7a8b71339b381301f85b37ca0a604f0e4b..5382423fa1e7835444b086d331a00f0cd99fc7b1 100644 (file)
@@ -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;
index 0f6a19fa1be506b1e16761bbb263591c6716ee87..87e54755fe32e17e3a28e67442552d8799139692 100644 (file)
@@ -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;
index 90a52e0316f631394d6b5d1dbce83e30e85809f0..e04180f96f3956c9e598ff0d0ab8e8e7c6a739ad 100644 (file)
@@ -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;
index 6b0779e9f2275fe7b48852fad1b7808c0deb5695..cc5f5726dd8f6763d294c313ddccdf5bec974cb5 100644 (file)
@@ -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");
 
index d7b6f738fafdee9ffa30d5fd3e6d57524fb485fd..c4234857e8afc611a6ac0d4f90d0e27a43f677eb 100644 (file)
@@ -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");