Merge pull request #11 from AlgorithmX2/MemoryLeakFix

Fix a memory leak with GridStorage
This commit is contained in:
thatsIch 2014-09-27 20:43:40 +02:00
commit ab9f67df5a

View file

@ -3,8 +3,8 @@ package appeng.me;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.HashSet; import java.lang.ref.WeakReference;
import java.util.Set; import java.util.WeakHashMap;
import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
@ -16,13 +16,13 @@ import appeng.core.WorldSettings;
public class GridStorage implements IGridStorage public class GridStorage implements IGridStorage
{ {
IGrid myGrid = null; private WeakReference<IGrid> internalGrid = null;
final long myID; final long myID;
final NBTTagCompound data; final NBTTagCompound data;
public boolean isDirty = false; public boolean isDirty = false;
private Set<GridStorage> divlist = new HashSet(); private WeakHashMap<GridStorage,Boolean> divlist = new WeakHashMap();
final GridStorageSearch mySearchEntry; // keep myself in the list until I'm final GridStorageSearch mySearchEntry; // keep myself in the list until I'm
// lost... // lost...
@ -76,9 +76,10 @@ public class GridStorage implements IGridStorage
{ {
isDirty = false; isDirty = false;
if ( myGrid != null ) Grid currentGrid = (Grid) getGrid();
if ( currentGrid != null )
{ {
((Grid) myGrid).saveState(); currentGrid.saveState();
} }
try try
@ -114,22 +115,22 @@ public class GridStorage implements IGridStorage
public IGrid getGrid() public IGrid getGrid()
{ {
return myGrid; return internalGrid == null ? null : internalGrid.get();
} }
public void setGrid(Grid grid) public void setGrid(Grid grid)
{ {
myGrid = grid; internalGrid = new WeakReference<IGrid>( grid );
} }
public void addDivided(GridStorage gs) public void addDivided(GridStorage gs)
{ {
divlist.add( gs ); divlist.put( gs, true );
} }
public boolean hasDivided(GridStorage myStorage) public boolean hasDivided(GridStorage myStorage)
{ {
return divlist.contains( myStorage ); return divlist.containsKey( myStorage );
} }
public void remove() public void remove()