Merge pull request #536 from Glitchfinder/master

Fixing a memory leak with mob tracking.
This commit is contained in:
Glitchfinder 2013-01-19 14:05:17 -08:00
commit a85c9679a9
2 changed files with 12 additions and 10 deletions

View File

@ -9,6 +9,7 @@ Key:
Version 1.3.14-dev Version 1.3.14-dev
+ Added new Hylian Luck skill to Herbalism. + Added new Hylian Luck skill to Herbalism.
= Fixed a memory leak involving mob tracking
- Removed extra durability loss from Leaf Blower - Removed extra durability loss from Leaf Blower
Version 1.3.13 Version 1.3.13

View File

@ -29,6 +29,7 @@ public class HashChunkManager implements ChunkManager {
public HashMap<String, ChunkStore> store = new HashMap<String, ChunkStore>(); public HashMap<String, ChunkStore> store = new HashMap<String, ChunkStore>();
public ArrayList<BlockStoreConversionZDirectory> converters = new ArrayList<BlockStoreConversionZDirectory>(); public ArrayList<BlockStoreConversionZDirectory> converters = new ArrayList<BlockStoreConversionZDirectory>();
private HashMap<UUID, Boolean> oldData = new HashMap<UUID, Boolean>(); private HashMap<UUID, Boolean> oldData = new HashMap<UUID, Boolean>();
// TODO: Investigate whether or not a LinkedList would be faster
private List<Entity> spawnedMobs = new ArrayList<Entity>(); private List<Entity> spawnedMobs = new ArrayList<Entity>();
private List<Entity> mobsToRemove = new ArrayList<Entity>(); private List<Entity> mobsToRemove = new ArrayList<Entity>();
private List<String> savedChunks = new ArrayList<String>(); private List<String> savedChunks = new ArrayList<String>();
@ -207,8 +208,8 @@ public class HashChunkManager implements ChunkManager {
iteratingMobs = true; iteratingMobs = true;
List<Entity> tempSpawnedMobs = new ArrayList<Entity>(spawnedMobs); List<Entity> tempSpawnedMobs = new ArrayList<Entity>(spawnedMobs);
tempSpawnedMobs.remove(removalCheckedMobs); tempSpawnedMobs.removeAll(removalCheckedMobs);
tempSpawnedMobs.remove(checkedMobs); tempSpawnedMobs.removeAll(checkedMobs);
for (Entity entity : tempSpawnedMobs) { for (Entity entity : tempSpawnedMobs) {
if (!isEntityInChunk(entity, cx, cz, world)) if (!isEntityInChunk(entity, cx, cz, world))
continue; continue;
@ -218,7 +219,7 @@ public class HashChunkManager implements ChunkManager {
} }
if (safeToRemoveMobs) { if (safeToRemoveMobs) {
spawnedMobs.remove(mobsToRemove); spawnedMobs.removeAll(mobsToRemove);
mobsToRemove.clear(); mobsToRemove.clear();
removalCheckedMobs.clear(); removalCheckedMobs.clear();
iteratingMobs = false; iteratingMobs = false;
@ -237,7 +238,7 @@ public class HashChunkManager implements ChunkManager {
boolean unloaded = false; boolean unloaded = false;
if (!store.containsKey(world.getName() + "," + cx + "," + cz)) { if (!store.containsKey(world.getName() + "," + cx + "," + cz)) {
List<Entity> tempSpawnedMobs = new ArrayList<Entity>(spawnedMobs); List<Entity> tempSpawnedMobs = new ArrayList<Entity>(spawnedMobs);
tempSpawnedMobs.remove(checkedMobs); tempSpawnedMobs.removeAll(checkedMobs);
for (Entity entity : tempSpawnedMobs) { for (Entity entity : tempSpawnedMobs) {
if (!isEntityInChunk(entity, cx, cz, world)) if (!isEntityInChunk(entity, cx, cz, world))
continue; continue;
@ -257,7 +258,7 @@ public class HashChunkManager implements ChunkManager {
ChunkStore out = store.get(world.getName() + "," + cx + "," + cz); ChunkStore out = store.get(world.getName() + "," + cx + "," + cz);
List<Entity> tempSpawnedMobs = new ArrayList<Entity>(spawnedMobs); List<Entity> tempSpawnedMobs = new ArrayList<Entity>(spawnedMobs);
tempSpawnedMobs.remove(checkedMobs); tempSpawnedMobs.removeAll(checkedMobs);
for (Entity entity : tempSpawnedMobs) { for (Entity entity : tempSpawnedMobs) {
if (!isEntityInChunk(entity, cx, cz, world)) if (!isEntityInChunk(entity, cx, cz, world))
continue; continue;
@ -341,7 +342,7 @@ public class HashChunkManager implements ChunkManager {
} }
List<Entity> tempSpawnedMobs = new ArrayList<Entity>(spawnedMobs); List<Entity> tempSpawnedMobs = new ArrayList<Entity>(spawnedMobs);
tempSpawnedMobs.remove(checkedMobs); tempSpawnedMobs.removeAll(checkedMobs);
for (Entity entity : tempSpawnedMobs) { for (Entity entity : tempSpawnedMobs) {
World entityWorld = entity.getWorld(); World entityWorld = entity.getWorld();
@ -389,8 +390,8 @@ public class HashChunkManager implements ChunkManager {
safeToRemoveMobs = false; safeToRemoveMobs = false;
List<Entity> tempSpawnedMobs = new ArrayList<Entity>(spawnedMobs); List<Entity> tempSpawnedMobs = new ArrayList<Entity>(spawnedMobs);
tempSpawnedMobs.remove(checkedMobs); tempSpawnedMobs.removeAll(checkedMobs);
tempSpawnedMobs.remove(removalCheckedMobs); tempSpawnedMobs.removeAll(removalCheckedMobs);
for (Entity entity : tempSpawnedMobs) { for (Entity entity : tempSpawnedMobs) {
World entityWorld = entity.getWorld(); World entityWorld = entity.getWorld();
@ -405,7 +406,7 @@ public class HashChunkManager implements ChunkManager {
safeToRemoveMobs = true; safeToRemoveMobs = true;
spawnedMobs.remove(mobsToRemove); spawnedMobs.removeAll(mobsToRemove);
mobsToRemove.clear(); mobsToRemove.clear();
checkedMobs.clear(); checkedMobs.clear();
removalCheckedMobs.clear(); removalCheckedMobs.clear();
@ -615,7 +616,7 @@ public class HashChunkManager implements ChunkManager {
mobsToRemove.add(entity); mobsToRemove.add(entity);
} }
spawnedMobs.remove(mobsToRemove); spawnedMobs.removeAll(mobsToRemove);
mobsToRemove.clear(); mobsToRemove.clear();
} }
} }