From 643af1c32b775f132d3b840d659f19d01f52a136 Mon Sep 17 00:00:00 2001 From: Glitchfinder Date: Sat, 19 Jan 2013 14:02:23 -0800 Subject: [PATCH] Fixing a memory leak involving mob tracking. --- .../blockmeta/chunkmeta/HashChunkManager.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java index eecfeb84b..9f1c837be 100755 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java @@ -29,6 +29,7 @@ public class HashChunkManager implements ChunkManager { public HashMap store = new HashMap(); public ArrayList converters = new ArrayList(); private HashMap oldData = new HashMap(); + // TODO: Investigate whether or not a LinkedList would be faster private List spawnedMobs = new ArrayList(); private List mobsToRemove = new ArrayList(); private List savedChunks = new ArrayList(); @@ -207,8 +208,8 @@ public class HashChunkManager implements ChunkManager { iteratingMobs = true; List tempSpawnedMobs = new ArrayList(spawnedMobs); - tempSpawnedMobs.remove(removalCheckedMobs); - tempSpawnedMobs.remove(checkedMobs); + tempSpawnedMobs.removeAll(removalCheckedMobs); + tempSpawnedMobs.removeAll(checkedMobs); for (Entity entity : tempSpawnedMobs) { if (!isEntityInChunk(entity, cx, cz, world)) continue; @@ -218,7 +219,7 @@ public class HashChunkManager implements ChunkManager { } if (safeToRemoveMobs) { - spawnedMobs.remove(mobsToRemove); + spawnedMobs.removeAll(mobsToRemove); mobsToRemove.clear(); removalCheckedMobs.clear(); iteratingMobs = false; @@ -237,7 +238,7 @@ public class HashChunkManager implements ChunkManager { boolean unloaded = false; if (!store.containsKey(world.getName() + "," + cx + "," + cz)) { List tempSpawnedMobs = new ArrayList(spawnedMobs); - tempSpawnedMobs.remove(checkedMobs); + tempSpawnedMobs.removeAll(checkedMobs); for (Entity entity : tempSpawnedMobs) { if (!isEntityInChunk(entity, cx, cz, world)) continue; @@ -257,7 +258,7 @@ public class HashChunkManager implements ChunkManager { ChunkStore out = store.get(world.getName() + "," + cx + "," + cz); List tempSpawnedMobs = new ArrayList(spawnedMobs); - tempSpawnedMobs.remove(checkedMobs); + tempSpawnedMobs.removeAll(checkedMobs); for (Entity entity : tempSpawnedMobs) { if (!isEntityInChunk(entity, cx, cz, world)) continue; @@ -341,7 +342,7 @@ public class HashChunkManager implements ChunkManager { } List tempSpawnedMobs = new ArrayList(spawnedMobs); - tempSpawnedMobs.remove(checkedMobs); + tempSpawnedMobs.removeAll(checkedMobs); for (Entity entity : tempSpawnedMobs) { World entityWorld = entity.getWorld(); @@ -389,8 +390,8 @@ public class HashChunkManager implements ChunkManager { safeToRemoveMobs = false; List tempSpawnedMobs = new ArrayList(spawnedMobs); - tempSpawnedMobs.remove(checkedMobs); - tempSpawnedMobs.remove(removalCheckedMobs); + tempSpawnedMobs.removeAll(checkedMobs); + tempSpawnedMobs.removeAll(removalCheckedMobs); for (Entity entity : tempSpawnedMobs) { World entityWorld = entity.getWorld(); @@ -405,7 +406,7 @@ public class HashChunkManager implements ChunkManager { safeToRemoveMobs = true; - spawnedMobs.remove(mobsToRemove); + spawnedMobs.removeAll(mobsToRemove); mobsToRemove.clear(); checkedMobs.clear(); removalCheckedMobs.clear(); @@ -615,7 +616,7 @@ public class HashChunkManager implements ChunkManager { mobsToRemove.add(entity); } - spawnedMobs.remove(mobsToRemove); + spawnedMobs.removeAll(mobsToRemove); mobsToRemove.clear(); } }