diff options
author | DS <ds.desour@proton.me> | 2023-03-24 12:34:44 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-24 12:34:44 +0100 |
commit | ed632f38547e2a63edb1a5dacbc37f3441cc43b6 (patch) | |
tree | adcec37379068ca4a34a3129d2fd66d74558efa1 /src/map.cpp | |
parent | f3b198e49008ea3aba568974c8f423fdc801d4a2 (diff) | |
download | minetest-ed632f38547e2a63edb1a5dacbc37f3441cc43b6.tar.xz |
Safely handle block deletion (#13315)
Co-authored-by: Jude Melton-Houghton <jwmhjwmh@gmail.com>
Diffstat (limited to 'src/map.cpp')
-rw-r--r-- | src/map.cpp | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/map.cpp b/src/map.cpp index 59d1a925d..239d5fb02 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -1309,6 +1309,8 @@ ServerMap::~ServerMap() */ delete dbase; delete dbase_ro; + + deleteDetachedBlocks(); } MapgenParams *ServerMap::getMapgenParams() @@ -1888,12 +1890,31 @@ bool ServerMap::deleteBlock(v3s16 blockpos) MapSector *sector = getSectorNoGenerate(p2d); if (!sector) return false; - sector->deleteBlock(block); + // It may not be safe to delete the block from memory at the moment + // (pointers to it could still be in use) + sector->detachBlock(block); + m_detached_blocks.push_back(block); } return true; } +void ServerMap::deleteDetachedBlocks() +{ + for (MapBlock *block : m_detached_blocks) { + assert(block->isOrphan()); + delete block; + } + m_detached_blocks.clear(); +} + +void ServerMap::step() +{ + // Delete from memory blocks removed by deleteBlocks() only when pointers + // to them are (probably) no longer in use + deleteDetachedBlocks(); +} + void ServerMap::PrintInfo(std::ostream &out) { out<<"ServerMap: "; |