diff --git a/build.xml b/build.xml index 2b0e943d..a12ff3be 100644 --- a/build.xml +++ b/build.xml @@ -58,7 +58,7 @@ - + diff --git a/src/common/me/nallar/tickthreading/Log.java b/src/common/me/nallar/tickthreading/Log.java index cced78e8..96353d04 100644 --- a/src/common/me/nallar/tickthreading/Log.java +++ b/src/common/me/nallar/tickthreading/Log.java @@ -3,11 +3,15 @@ import java.util.logging.Level; import java.util.logging.Logger; +import cpw.mods.fml.common.FMLLog; +import net.minecraft.src.World; + @SuppressWarnings ("UnusedDeclaration") public class Log { private static final Logger LOGGER = Logger.getLogger("TickThreading"); static { + LOGGER.setParent(FMLLog.getLogger()); LOGGER.setLevel(Level.ALL); } @@ -66,4 +70,8 @@ public static void finer(String msg, Throwable t) { public static void finest(String msg, Throwable t) { LOGGER.log(Level.FINEST, msg, t); } + + public static String name(World world) { + return world.getWorldInfo().getWorldName() + ":" + world.getWorldInfo().getDimension() + ":" + world.hashCode(); + } } diff --git a/src/common/me/nallar/tickthreading/minecraft/ThreadManager.java b/src/common/me/nallar/tickthreading/minecraft/ThreadManager.java index 41e7fe6f..4035a0dc 100644 --- a/src/common/me/nallar/tickthreading/minecraft/ThreadManager.java +++ b/src/common/me/nallar/tickthreading/minecraft/ThreadManager.java @@ -75,31 +75,35 @@ public int getHashCode(Entity entity) { } private synchronized void processChanges() { - synchronized (changeProcessLock) { - for (TileEntity tileEntity : toAddTileEntities) { - getRunnableForTileEntity(tileEntity).add(tileEntity); - } - for (TileEntity tileEntity : toRemoveTileEntities) { - getRunnableForTileEntity(tileEntity).remove(tileEntity); - } - for (Entity entity : toAddEntities) { - getRunnableForEntity(entity).add(entity); - } - for (Entity entity : toRemoveEntities) { - getRunnableForEntity(entity).remove(entity); - } - Iterator> iterator = tickCallables.iterator(); - while(iterator.hasNext()){ - TickCallable tickCallable = iterator.next(); - if(tickCallable.isEmpty()){ - iterator.remove(); - if(tickCallable instanceof EntityTickCallable){ - entityRunnables.remove(tickCallable.hashCode); - } else { - tileEntityRunnables.remove(tickCallable.hashCode); + try{ + synchronized (changeProcessLock) { + for (TileEntity tileEntity : toAddTileEntities) { + getRunnableForTileEntity(tileEntity).add(tileEntity); + } + for (TileEntity tileEntity : toRemoveTileEntities) { + getRunnableForTileEntity(tileEntity).remove(tileEntity); + } + for (Entity entity : toAddEntities) { + getRunnableForEntity(entity).add(entity); + } + for (Entity entity : toRemoveEntities) { + getRunnableForEntity(entity).remove(entity); + } + Iterator> iterator = tickCallables.iterator(); + while(iterator.hasNext()){ + TickCallable tickCallable = iterator.next(); + if(tickCallable.isEmpty()){ + iterator.remove(); + if(tickCallable instanceof EntityTickCallable){ + entityRunnables.remove(tickCallable.hashCode); + } else { + tileEntityRunnables.remove(tickCallable.hashCode); + } } } } + } catch(Exception e) { + Log.severe("Exception occured while processing entity changes: ", e); } } diff --git a/src/common/me/nallar/tickthreading/minecraft/TickThreading.java b/src/common/me/nallar/tickthreading/minecraft/TickThreading.java index 13c9bc2d..fe497899 100644 --- a/src/common/me/nallar/tickthreading/minecraft/TickThreading.java +++ b/src/common/me/nallar/tickthreading/minecraft/TickThreading.java @@ -58,13 +58,14 @@ public void onWorldLoad(WorldEvent.Load event) { Field loadedTileEntityField = getListFields(World.class)[loadedTileEntityFieldIndex]; Field loadedEntityField = getListFields(World.class)[loadedEntityFieldIndex]; new LoadedTileEntityList(event.world, loadedTileEntityField, manager); + Log.info("Threading initialised for world " + Log.name(event.world)); // TODO: Enable entity tick threading // Requires: // - AxisAlignedBB pool threadlocal // - ^automated patching //new LoadedEntityList(event.world, loadedEntityField, manager); } catch (Exception e) { - Log.severe("Failed to initialise tile threading for world " + event.world.getWorldInfo().getWorldName(), e); + Log.severe("Failed to initialise tile threading for world " + Log.name(event.world), e); } } @@ -79,7 +80,7 @@ public void onWorldUnload(WorldEvent.Unload event) { Log.severe("Looks like another mod broke threading for world, probably a long time ago: " + event.world.getWorldInfo().getWorldName()); } } catch (Exception e) { - Log.severe("Probable memory leak: Failed to unload tile threading for world " + event.world.getWorldInfo().getWorldName(), e); + Log.severe("Probable memory leak: Failed to unload tile threading for world " + Log.name(event.world), e); } } diff --git a/src/common/me/nallar/tickthreading/minecraft/tickcallables/TileEntityTickCallable.java b/src/common/me/nallar/tickthreading/minecraft/tickcallables/TileEntityTickCallable.java index 527f9cd6..6d600f7f 100644 --- a/src/common/me/nallar/tickthreading/minecraft/tickcallables/TileEntityTickCallable.java +++ b/src/common/me/nallar/tickthreading/minecraft/tickcallables/TileEntityTickCallable.java @@ -19,9 +19,13 @@ public TileEntityTickCallable(World world, String identifier, ThreadManager mana @Override public T call() { - try { - IChunkProvider chunkProvider = world.getChunkProvider(); - for (TileEntity tileEntity : tileEntityList) { + IChunkProvider chunkProvider = world.getChunkProvider(); + for (TileEntity tileEntity : tileEntityList) { + try { + if (!tileEntity.isInvalid()) { + // TODO: Lock this chunk, and if this entity is on a boundary, that chunk. + tileEntity.updateEntity(); + } if (tileEntity.isInvalid()) { manager.remove(tileEntity); Log.warning("Removed invalid tile: " + tileEntity.xCoord + ", " + tileEntity.yCoord + ", " + tileEntity.zCoord + "\ttype:" + tileEntity.getClass().toString()); @@ -31,16 +35,14 @@ public T call() { chunk.cleanChunkBlockTileEntity(tileEntity.xCoord & 0xf, tileEntity.yCoord, tileEntity.zCoord & 0xf); } } - } else { - tileEntity.updateEntity(); - } - if (manager.getHashCode(tileEntity) != hashCode) { + } else if (manager.getHashCode(tileEntity) != hashCode) { manager.remove(tileEntity); manager.add(tileEntity); } + } catch (Exception exception) { + Log.severe("Exception during tile entity tick "); + Log.severe("Tick region: " + identifier + ":", exception); } - } catch (Exception exception) { - Log.severe("Exception during tile entity tick at " + identifier + ":", exception); } return null; }