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;
}