aboutsummaryrefslogtreecommitdiff
path: root/src/map.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/map.cpp')
-rw-r--r--src/map.cpp23
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: ";