diff options
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: "; |