summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattes D <github@xoft.cz>2016-12-15 15:28:15 +0100
committerGitHub <noreply@github.com>2016-12-15 15:28:15 +0100
commitfc40932ab1a663574938535dae918d8cd916efe6 (patch)
tree24a0b525c79b552a50700784a2e37a87489b85f4
parentAPIDump: Proper error messages on apicheck failures. (diff)
parentFixed minecart destruction using deallocated memory. (diff)
downloadcuberite-fc40932ab1a663574938535dae918d8cd916efe6.tar
cuberite-fc40932ab1a663574938535dae918d8cd916efe6.tar.gz
cuberite-fc40932ab1a663574938535dae918d8cd916efe6.tar.bz2
cuberite-fc40932ab1a663574938535dae918d8cd916efe6.tar.lz
cuberite-fc40932ab1a663574938535dae918d8cd916efe6.tar.xz
cuberite-fc40932ab1a663574938535dae918d8cd916efe6.tar.zst
cuberite-fc40932ab1a663574938535dae918d8cd916efe6.zip
-rw-r--r--src/Entities/Minecart.cpp11
-rw-r--r--src/WorldStorage/WorldStorage.cpp2
2 files changed, 10 insertions, 3 deletions
diff --git a/src/Entities/Minecart.cpp b/src/Entities/Minecart.cpp
index c75c8288c..b8e8e9f29 100644
--- a/src/Entities/Minecart.cpp
+++ b/src/Entities/Minecart.cpp
@@ -1250,10 +1250,15 @@ void cMinecartWithChest::Destroyed()
m_Contents.CopyToItems(Pickups);
- // This makes the command not execute if the world is in the midst of destruction :)
- GetWorld()->ScheduleTask(1, [this, Pickups](cWorld & World)
+ // Schedule the pickups creation for the next world tick
+ // This avoids a deadlock when terminating the world
+ // Note that the scheduled task may be run when this object is no longer valid, we need to store everything in the task's captured variables
+ auto posX = GetPosX();
+ auto posY = GetPosY() + 1;
+ auto posZ = GetPosZ();
+ GetWorld()->ScheduleTask(1, [Pickups, posX, posY, posZ](cWorld & World)
{
- World.SpawnItemPickups(Pickups, GetPosX(), GetPosY() + 1, GetPosZ(), 4);
+ World.SpawnItemPickups(Pickups, posX, posY, posZ, 4);
});
}
diff --git a/src/WorldStorage/WorldStorage.cpp b/src/WorldStorage/WorldStorage.cpp
index 55555d731..29fe78d4f 100644
--- a/src/WorldStorage/WorldStorage.cpp
+++ b/src/WorldStorage/WorldStorage.cpp
@@ -142,6 +142,8 @@ size_t cWorldStorage::GetSaveQueueLength(void)
void cWorldStorage::QueueLoadChunk(int a_ChunkX, int a_ChunkZ, cChunkCoordCallback * a_Callback)
{
+ ASSERT((a_ChunkX > -0x08000000) && (a_ChunkX < 0x08000000));
+ ASSERT((a_ChunkZ > -0x08000000) && (a_ChunkZ < 0x08000000));
ASSERT(m_World->IsChunkQueued(a_ChunkX, a_ChunkZ));
m_LoadQueue.EnqueueItem(cChunkCoordsWithCallback(a_ChunkX, a_ChunkZ, a_Callback));