From 481ff7cc3aad20dda680aff943ad366a02f4dbee Mon Sep 17 00:00:00 2001 From: Mogball Date: Sun, 12 Apr 2020 16:05:29 -0400 Subject: Use HashSet for machine block update and limit recursion depth --- src/main/java/gregtech/api/GregTech_API.java | 2 +- .../threads/GT_Runnable_MachineBlockUpdate.java | 56 +++++++++++++++++----- 2 files changed, 45 insertions(+), 13 deletions(-) (limited to 'src/main/java/gregtech') diff --git a/src/main/java/gregtech/api/GregTech_API.java b/src/main/java/gregtech/api/GregTech_API.java index dac494d9bc..0a6b7e96fe 100644 --- a/src/main/java/gregtech/api/GregTech_API.java +++ b/src/main/java/gregtech/api/GregTech_API.java @@ -390,7 +390,7 @@ public class GregTech_API { */ public static boolean causeMachineUpdate(World aWorld, int aX, int aY, int aZ) { if (!aWorld.isRemote) - new Thread(new GT_Runnable_MachineBlockUpdate(aWorld, aX, aY, aZ), "Machine Block Updating").start(); + new GT_Runnable_MachineBlockUpdate(aWorld, aX, aY, aZ).run(); return true; } diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java index 92944d3e32..523d504884 100644 --- a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java +++ b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java @@ -1,43 +1,75 @@ package gregtech.api.threads; import gregtech.api.GregTech_API; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable; +import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid; +import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Item; + import net.minecraft.tileentity.TileEntity; import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; -import java.util.ArrayList; +import java.util.Set; +import java.util.HashSet; public class GT_Runnable_MachineBlockUpdate implements Runnable { private final int mX, mY, mZ; private final World mWorld; + private final Set mVisited; + + private static final int MAX_UPDATE_DEPTH = 128; public GT_Runnable_MachineBlockUpdate(World aWorld, int aX, int aY, int aZ) { mWorld = aWorld; mX = aX; mY = aY; mZ = aZ; + mVisited = new HashSet(80); + } + + private boolean shouldVisit(int aX, int aY, int aZ) { + return !mVisited.contains(new ChunkPosition(aX, aY, aZ)); } - private static void stepToUpdateMachine(World aWorld, int aX, int aY, int aZ, ArrayList aList) { - aList.add(new ChunkPosition(aX, aY, aZ)); + private boolean shouldUpdate(TileEntity aTileEntity) { + // Stop recursion on cables and pipes + if (aTileEntity == null || !(aTileEntity instanceof IGregTechTileEntity)) + return false; + IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aTileEntity).getMetaTileEntity(); + return + !(tMetaTileEntity instanceof GT_MetaPipeEntity_Cable) && + !(tMetaTileEntity instanceof GT_MetaPipeEntity_Fluid) && + !(tMetaTileEntity instanceof GT_MetaPipeEntity_Item); + } + + private void stepToUpdateMachine(World aWorld, int aX, int aY, int aZ) { + mVisited.add(new ChunkPosition(aX, aY, aZ)); TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + if (!shouldUpdate(tTileEntity) || mVisited.size() > MAX_UPDATE_DEPTH) + return; + if (tTileEntity instanceof IMachineBlockUpdateable) ((IMachineBlockUpdateable) tTileEntity).onMachineBlockUpdate(); - if (aList.size() < 5 || (tTileEntity instanceof IMachineBlockUpdateable) || GregTech_API.isMachineBlock(aWorld.getBlock(aX, aY, aZ), aWorld.getBlockMetadata(aX, aY, aZ))) { - if (!aList.contains(new ChunkPosition(aX + 1, aY, aZ))) stepToUpdateMachine(aWorld, aX + 1, aY, aZ, aList); - if (!aList.contains(new ChunkPosition(aX - 1, aY, aZ))) stepToUpdateMachine(aWorld, aX - 1, aY, aZ, aList); - if (!aList.contains(new ChunkPosition(aX, aY + 1, aZ))) stepToUpdateMachine(aWorld, aX, aY + 1, aZ, aList); - if (!aList.contains(new ChunkPosition(aX, aY - 1, aZ))) stepToUpdateMachine(aWorld, aX, aY - 1, aZ, aList); - if (!aList.contains(new ChunkPosition(aX, aY, aZ + 1))) stepToUpdateMachine(aWorld, aX, aY, aZ + 1, aList); - if (!aList.contains(new ChunkPosition(aX, aY, aZ - 1))) stepToUpdateMachine(aWorld, aX, aY, aZ - 1, aList); + + if (mVisited.size() < 5 || + (tTileEntity instanceof IMachineBlockUpdateable) || + GregTech_API.isMachineBlock(aWorld.getBlock(aX, aY, aZ), aWorld.getBlockMetadata(aX, aY, aZ))) { + if (shouldVisit(aX + 1, aY, aZ)) stepToUpdateMachine(aWorld, aX + 1, aY, aZ); + if (shouldVisit(aX - 1, aY, aZ)) stepToUpdateMachine(aWorld, aX - 1, aY, aZ); + if (shouldVisit(aX, aY + 1, aZ)) stepToUpdateMachine(aWorld, aX, aY + 1, aZ); + if (shouldVisit(aX, aY - 1, aZ)) stepToUpdateMachine(aWorld, aX, aY - 1, aZ); + if (shouldVisit(aX, aY, aZ + 1)) stepToUpdateMachine(aWorld, aX, aY, aZ + 1); + if (shouldVisit(aX, aY, aZ - 1)) stepToUpdateMachine(aWorld, aX, aY, aZ - 1); } } @Override public void run() { try { - stepToUpdateMachine(mWorld, mX, mY, mZ, new ArrayList()); + stepToUpdateMachine(mWorld, mX, mY, mZ); } catch (Throwable e) {/**/} } -} \ No newline at end of file +} -- cgit From 209d62576be81d919b1db916c3c8540c1ca03eed Mon Sep 17 00:00:00 2001 From: Mogball Date: Sun, 12 Apr 2020 16:32:50 -0400 Subject: Fix non GT tileentities should still propagate --- .../java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src/main/java/gregtech') diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java index 523d504884..1f47ed3bfe 100644 --- a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java +++ b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java @@ -20,6 +20,7 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { private final World mWorld; private final Set mVisited; + // Hopefully large enough for most multi-block machines private static final int MAX_UPDATE_DEPTH = 128; public GT_Runnable_MachineBlockUpdate(World aWorld, int aX, int aY, int aZ) { @@ -35,9 +36,12 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { } private boolean shouldUpdate(TileEntity aTileEntity) { - // Stop recursion on cables and pipes - if (aTileEntity == null || !(aTileEntity instanceof IGregTechTileEntity)) + if (aTileEntity == null) return false; + + // Stop recursion on GregTech cables, item pipes, and fluid pipes + if (!(aTileEntity instanceof IGregTechTileEntity)) + return true; IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aTileEntity).getMetaTileEntity(); return !(tMetaTileEntity instanceof GT_MetaPipeEntity_Cable) && -- cgit From 15359ee04e8773b256aa3cbd7230947528453660 Mon Sep 17 00:00:00 2001 From: Mogball Date: Sun, 12 Apr 2020 22:16:11 -0400 Subject: Review comments --- .../threads/GT_Runnable_MachineBlockUpdate.java | 54 ++++++++++------------ 1 file changed, 25 insertions(+), 29 deletions(-) (limited to 'src/main/java/gregtech') diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java index 1f47ed3bfe..03cd53c3dd 100644 --- a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java +++ b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java @@ -31,49 +31,45 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { mVisited = new HashSet(80); } - private boolean shouldVisit(int aX, int aY, int aZ) { - return !mVisited.contains(new ChunkPosition(aX, aY, aZ)); - } - - private boolean shouldUpdate(TileEntity aTileEntity) { + private boolean shouldRecurse(TileEntity aTileEntity, int aX, int aY, int aZ) { if (aTileEntity == null) - return false; + return false; + + if (aTileEntity instanceof IGregTechTileEntity) { + // Stop recursion on GregTech cables, item pipes, and fluid pipes + IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aTileEntity).getMetaTileEntity(); + if ((tMetaTileEntity instanceof GT_MetaPipeEntity_Cable) || + (tMetaTileEntity instanceof GT_MetaPipeEntity_Fluid) || + (tMetaTileEntity instanceof GT_MetaPipeEntity_Item)) + return false; + } - // Stop recursion on GregTech cables, item pipes, and fluid pipes - if (!(aTileEntity instanceof IGregTechTileEntity)) - return true; - IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aTileEntity).getMetaTileEntity(); - return - !(tMetaTileEntity instanceof GT_MetaPipeEntity_Cable) && - !(tMetaTileEntity instanceof GT_MetaPipeEntity_Fluid) && - !(tMetaTileEntity instanceof GT_MetaPipeEntity_Item); + return (aTileEntity instanceof IMachineBlockUpdateable) || + GregTech_API.isMachineBlock(mWorld.getBlock(aX, aY, aZ), mWorld.getBlockMetadata(aX, aY, aZ)); } - private void stepToUpdateMachine(World aWorld, int aX, int aY, int aZ) { - mVisited.add(new ChunkPosition(aX, aY, aZ)); - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if (!shouldUpdate(tTileEntity) || mVisited.size() > MAX_UPDATE_DEPTH) + private void stepToUpdateMachine(int aX, int aY, int aZ) { + if (!mVisited.add(new ChunkPosition(aX, aY, aZ)) || mVisited.size() > MAX_UPDATE_DEPTH) return; - if (tTileEntity instanceof IMachineBlockUpdateable) + TileEntity tTileEntity = mWorld.getTileEntity(aX, aY, aZ); + if (tTileEntity != null && tTileEntity instanceof IMachineBlockUpdateable) ((IMachineBlockUpdateable) tTileEntity).onMachineBlockUpdate(); - if (mVisited.size() < 5 || - (tTileEntity instanceof IMachineBlockUpdateable) || - GregTech_API.isMachineBlock(aWorld.getBlock(aX, aY, aZ), aWorld.getBlockMetadata(aX, aY, aZ))) { - if (shouldVisit(aX + 1, aY, aZ)) stepToUpdateMachine(aWorld, aX + 1, aY, aZ); - if (shouldVisit(aX - 1, aY, aZ)) stepToUpdateMachine(aWorld, aX - 1, aY, aZ); - if (shouldVisit(aX, aY + 1, aZ)) stepToUpdateMachine(aWorld, aX, aY + 1, aZ); - if (shouldVisit(aX, aY - 1, aZ)) stepToUpdateMachine(aWorld, aX, aY - 1, aZ); - if (shouldVisit(aX, aY, aZ + 1)) stepToUpdateMachine(aWorld, aX, aY, aZ + 1); - if (shouldVisit(aX, aY, aZ - 1)) stepToUpdateMachine(aWorld, aX, aY, aZ - 1); + if (mVisited.size() < 5 || shouldRecurse(tTileEntity, aX, aY, aZ)) { + stepToUpdateMachine(aX + 1, aY, aZ); + stepToUpdateMachine(aX - 1, aY, aZ); + stepToUpdateMachine(aX, aY + 1, aZ); + stepToUpdateMachine(aX, aY - 1, aZ); + stepToUpdateMachine(aX, aY, aZ + 1); + stepToUpdateMachine(aX, aY, aZ - 1); } } @Override public void run() { try { - stepToUpdateMachine(mWorld, mX, mY, mZ); + stepToUpdateMachine(mX, mY, mZ); } catch (Throwable e) {/**/} } } -- cgit From 3c8c99ce5e3c850ca7ec46e88771845718d8cfc3 Mon Sep 17 00:00:00 2001 From: Mogball Date: Mon, 13 Apr 2020 00:12:03 -0400 Subject: remove recursion depth limit and nullcheck on instanceof --- .../gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'src/main/java/gregtech') diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java index 03cd53c3dd..5261303838 100644 --- a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java +++ b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java @@ -20,9 +20,6 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { private final World mWorld; private final Set mVisited; - // Hopefully large enough for most multi-block machines - private static final int MAX_UPDATE_DEPTH = 128; - public GT_Runnable_MachineBlockUpdate(World aWorld, int aX, int aY, int aZ) { mWorld = aWorld; mX = aX; @@ -32,9 +29,6 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { } private boolean shouldRecurse(TileEntity aTileEntity, int aX, int aY, int aZ) { - if (aTileEntity == null) - return false; - if (aTileEntity instanceof IGregTechTileEntity) { // Stop recursion on GregTech cables, item pipes, and fluid pipes IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aTileEntity).getMetaTileEntity(); @@ -49,11 +43,11 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { } private void stepToUpdateMachine(int aX, int aY, int aZ) { - if (!mVisited.add(new ChunkPosition(aX, aY, aZ)) || mVisited.size() > MAX_UPDATE_DEPTH) + if (!mVisited.add(new ChunkPosition(aX, aY, aZ))) return; TileEntity tTileEntity = mWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity != null && tTileEntity instanceof IMachineBlockUpdateable) + if (tTileEntity instanceof IMachineBlockUpdateable) ((IMachineBlockUpdateable) tTileEntity).onMachineBlockUpdate(); if (mVisited.size() < 5 || shouldRecurse(tTileEntity, aX, aY, aZ)) { -- cgit From 0045463552078ca9a93b6ba4299e802b5645d4bb Mon Sep 17 00:00:00 2001 From: Martin Robertz Date: Mon, 13 Apr 2020 23:08:26 +0200 Subject: Revert "Use HashSet for machine block update and limit recursion depth" --- src/main/java/gregtech/api/GregTech_API.java | 2 +- .../threads/GT_Runnable_MachineBlockUpdate.java | 52 ++++++---------------- 2 files changed, 14 insertions(+), 40 deletions(-) (limited to 'src/main/java/gregtech') diff --git a/src/main/java/gregtech/api/GregTech_API.java b/src/main/java/gregtech/api/GregTech_API.java index 0a6b7e96fe..dac494d9bc 100644 --- a/src/main/java/gregtech/api/GregTech_API.java +++ b/src/main/java/gregtech/api/GregTech_API.java @@ -390,7 +390,7 @@ public class GregTech_API { */ public static boolean causeMachineUpdate(World aWorld, int aX, int aY, int aZ) { if (!aWorld.isRemote) - new GT_Runnable_MachineBlockUpdate(aWorld, aX, aY, aZ).run(); + new Thread(new GT_Runnable_MachineBlockUpdate(aWorld, aX, aY, aZ), "Machine Block Updating").start(); return true; } diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java index 5261303838..92944d3e32 100644 --- a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java +++ b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java @@ -1,69 +1,43 @@ package gregtech.api.threads; import gregtech.api.GregTech_API; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Item; - import net.minecraft.tileentity.TileEntity; import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; -import java.util.Set; -import java.util.HashSet; +import java.util.ArrayList; public class GT_Runnable_MachineBlockUpdate implements Runnable { private final int mX, mY, mZ; private final World mWorld; - private final Set mVisited; public GT_Runnable_MachineBlockUpdate(World aWorld, int aX, int aY, int aZ) { mWorld = aWorld; mX = aX; mY = aY; mZ = aZ; - mVisited = new HashSet(80); } - private boolean shouldRecurse(TileEntity aTileEntity, int aX, int aY, int aZ) { - if (aTileEntity instanceof IGregTechTileEntity) { - // Stop recursion on GregTech cables, item pipes, and fluid pipes - IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aTileEntity).getMetaTileEntity(); - if ((tMetaTileEntity instanceof GT_MetaPipeEntity_Cable) || - (tMetaTileEntity instanceof GT_MetaPipeEntity_Fluid) || - (tMetaTileEntity instanceof GT_MetaPipeEntity_Item)) - return false; - } - - return (aTileEntity instanceof IMachineBlockUpdateable) || - GregTech_API.isMachineBlock(mWorld.getBlock(aX, aY, aZ), mWorld.getBlockMetadata(aX, aY, aZ)); - } - - private void stepToUpdateMachine(int aX, int aY, int aZ) { - if (!mVisited.add(new ChunkPosition(aX, aY, aZ))) - return; - - TileEntity tTileEntity = mWorld.getTileEntity(aX, aY, aZ); + private static void stepToUpdateMachine(World aWorld, int aX, int aY, int aZ, ArrayList aList) { + aList.add(new ChunkPosition(aX, aY, aZ)); + TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); if (tTileEntity instanceof IMachineBlockUpdateable) ((IMachineBlockUpdateable) tTileEntity).onMachineBlockUpdate(); - - if (mVisited.size() < 5 || shouldRecurse(tTileEntity, aX, aY, aZ)) { - stepToUpdateMachine(aX + 1, aY, aZ); - stepToUpdateMachine(aX - 1, aY, aZ); - stepToUpdateMachine(aX, aY + 1, aZ); - stepToUpdateMachine(aX, aY - 1, aZ); - stepToUpdateMachine(aX, aY, aZ + 1); - stepToUpdateMachine(aX, aY, aZ - 1); + if (aList.size() < 5 || (tTileEntity instanceof IMachineBlockUpdateable) || GregTech_API.isMachineBlock(aWorld.getBlock(aX, aY, aZ), aWorld.getBlockMetadata(aX, aY, aZ))) { + if (!aList.contains(new ChunkPosition(aX + 1, aY, aZ))) stepToUpdateMachine(aWorld, aX + 1, aY, aZ, aList); + if (!aList.contains(new ChunkPosition(aX - 1, aY, aZ))) stepToUpdateMachine(aWorld, aX - 1, aY, aZ, aList); + if (!aList.contains(new ChunkPosition(aX, aY + 1, aZ))) stepToUpdateMachine(aWorld, aX, aY + 1, aZ, aList); + if (!aList.contains(new ChunkPosition(aX, aY - 1, aZ))) stepToUpdateMachine(aWorld, aX, aY - 1, aZ, aList); + if (!aList.contains(new ChunkPosition(aX, aY, aZ + 1))) stepToUpdateMachine(aWorld, aX, aY, aZ + 1, aList); + if (!aList.contains(new ChunkPosition(aX, aY, aZ - 1))) stepToUpdateMachine(aWorld, aX, aY, aZ - 1, aList); } } @Override public void run() { try { - stepToUpdateMachine(mX, mY, mZ); + stepToUpdateMachine(mWorld, mX, mY, mZ, new ArrayList()); } catch (Throwable e) {/**/} } -} +} \ No newline at end of file -- cgit From de2faf61039ba3075c94c3e7d76ef1c05e87773f Mon Sep 17 00:00:00 2001 From: bartimaeusnek <33183715+bartimaeusnek@users.noreply.github.com> Date: Tue, 14 Apr 2020 00:12:34 +0200 Subject: Tried to make Mogballs Optimisation properly threaded Signed-off-by: bartimaeusnek <33183715+bartimaeusnek@users.noreply.github.com> --- src/main/java/gregtech/api/GregTech_API.java | 12 +- .../threads/GT_Runnable_MachineBlockUpdate.java | 135 ++++++++++++++++++--- 2 files changed, 127 insertions(+), 20 deletions(-) (limited to 'src/main/java/gregtech') diff --git a/src/main/java/gregtech/api/GregTech_API.java b/src/main/java/gregtech/api/GregTech_API.java index 0a6b7e96fe..c7d02c7bed 100644 --- a/src/main/java/gregtech/api/GregTech_API.java +++ b/src/main/java/gregtech/api/GregTech_API.java @@ -389,9 +389,15 @@ public class GregTech_API { * @param aZ is the Z-Coord of the update causing Block */ public static boolean causeMachineUpdate(World aWorld, int aX, int aY, int aZ) { - if (!aWorld.isRemote) - new GT_Runnable_MachineBlockUpdate(aWorld, aX, aY, aZ).run(); - return true; + if (!aWorld.isRemote && !GT_Runnable_MachineBlockUpdate.getINSTANCETHREAD().isAlive()) { + GT_Runnable_MachineBlockUpdate.setMachineUpdateValues(aWorld, aX, aY, aZ); + GT_Runnable_MachineBlockUpdate.getINSTANCETHREAD().start(); + return true; + } else if (!aWorld.isRemote && !GT_Runnable_MachineBlockUpdate.isAllowedToRun()){ + GT_Runnable_MachineBlockUpdate.setMachineUpdateValues(aWorld, aX, aY, aZ); + return true; + } + return false; } /** diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java index 5261303838..27dc697daa 100644 --- a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java +++ b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java @@ -1,31 +1,118 @@ package gregtech.api.threads; import gregtech.api.GregTech_API; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable; import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid; import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Item; - import net.minecraft.tileentity.TileEntity; import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; -import java.util.Set; import java.util.HashSet; +import java.util.Queue; +import java.util.Set; +import java.util.concurrent.ConcurrentLinkedQueue; public class GT_Runnable_MachineBlockUpdate implements Runnable { - private final int mX, mY, mZ; - private final World mWorld; - private final Set mVisited; - - public GT_Runnable_MachineBlockUpdate(World aWorld, int aX, int aY, int aZ) { - mWorld = aWorld; - mX = aX; - mY = aY; - mZ = aZ; - mVisited = new HashSet(80); + + private static int mX; + private static int mY; + private static int mZ; + private static World mWorld; + private static final Set mVisited = new HashSet<>(80); + + //Threading + private static boolean allowedToRun; //makes if this thread is idle + private static final Queue toUpdate = new ConcurrentLinkedQueue<>(); //blocks added while this thread ran + private static final Thread INSTANCETHREAD = new Thread(new GT_Runnable_MachineBlockUpdate()); //Instance of this thread + + //This class should never be initiated outside of this class! + private GT_Runnable_MachineBlockUpdate() { + } + + public static synchronized void setmX(int mX) { + GT_Runnable_MachineBlockUpdate.mX = mX; + } + + public static synchronized void setmY(int mY) { + GT_Runnable_MachineBlockUpdate.mY = mY; + } + + public static synchronized void setmZ(int mZ) { + GT_Runnable_MachineBlockUpdate.mZ = mZ; + } + + public static synchronized void setmWorld(World mWorld) { + GT_Runnable_MachineBlockUpdate.mWorld = mWorld; + } + + /** + * Clears the mVisited HashSet + */ + public static synchronized void resetVisited() { + synchronized (GT_Runnable_MachineBlockUpdate.mVisited) { + GT_Runnable_MachineBlockUpdate.mVisited.clear(); + } + } + + /** + * Never call this Method without checking if the thead is NOT allowed to run! + */ + private static void setMachineUpdateValuesUnsafe(World aWorld, int aX, int aY, int aZ){ + GT_Runnable_MachineBlockUpdate.setmZ(aZ); + GT_Runnable_MachineBlockUpdate.setmY(aY); + GT_Runnable_MachineBlockUpdate.setmX(aX); + GT_Runnable_MachineBlockUpdate.setmWorld(aWorld); + GT_Runnable_MachineBlockUpdate.resetVisited(); + GT_Runnable_MachineBlockUpdate.setAllowedToRun(true); + } + + /** + * If the thread is idleing, sets new values and remove the idle flag, otherwise, queue the cooridinates. + */ + public static synchronized void setMachineUpdateValues(World aWorld, int aX, int aY, int aZ) { + if (GT_Runnable_MachineBlockUpdate.isAllowedToRun()) { + toUpdate.add(new Coordinates(aX, aY, aZ, aWorld)); + } else { + GT_Runnable_MachineBlockUpdate.setMachineUpdateValuesUnsafe(aWorld, aX, aY, aZ); + } + } + + private static class Coordinates { + + private final int mX; + private final int mY; + private final int mZ; + private final World mWorld; + + public Coordinates(int mX, int mY, int mZ, World mWorld) { + this.mX = mX; + this.mY = mY; + this.mZ = mZ; + this.mWorld = mWorld; + } + + /** + * Updated the Main Update Thread while its Idle + */ + public void update() { + GT_Runnable_MachineBlockUpdate.setMachineUpdateValues(this.mWorld,this.mX,this.mY,this.mZ); + } + } + + public static synchronized boolean isAllowedToRun() { + return allowedToRun; + } + + public static synchronized void setAllowedToRun(boolean unlocked) { + GT_Runnable_MachineBlockUpdate.allowedToRun = unlocked; + } + + public static Thread getINSTANCETHREAD() { + return INSTANCETHREAD; } private boolean shouldRecurse(TileEntity aTileEntity, int aX, int aY, int aZ) { @@ -58,12 +145,26 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { stepToUpdateMachine(aX, aY, aZ + 1); stepToUpdateMachine(aX, aY, aZ - 1); } + } @Override public void run() { - try { - stepToUpdateMachine(mX, mY, mZ); - } catch (Throwable e) {/**/} + for(;;) { //infinite loop + if (isAllowedToRun()) {//Are we ready to work? + try { + stepToUpdateMachine(mX, mY, mZ); + } catch (Throwable e) {/**/} + setAllowedToRun(false); //Work is finished, wait for new Coords. + } else { + //Checkes if the Update Queue has members + //DO NOT USE OPTIONALS HERE! + synchronized (toUpdate) { + Coordinates coordinates = toUpdate.poll(); + if (coordinates != null) + coordinates.update(); + } + } + } } -} +} \ No newline at end of file -- cgit From 3178edd36a563bffaaa0fab2c48640464c063475 Mon Sep 17 00:00:00 2001 From: bartimaeusnek <33183715+bartimaeusnek@users.noreply.github.com> Date: Tue, 14 Apr 2020 02:07:03 +0200 Subject: Named the thread + actually use the right method (and not the old one lol) + Interrupted the Thread onServerAboutToStop Signed-off-by: bartimaeusnek <33183715+bartimaeusnek@users.noreply.github.com> --- src/main/java/gregtech/GT_Mod.java | 2 ++ .../threads/GT_Runnable_MachineBlockUpdate.java | 40 +++++++++++++++------- 2 files changed, 30 insertions(+), 12 deletions(-) (limited to 'src/main/java/gregtech') diff --git a/src/main/java/gregtech/GT_Mod.java b/src/main/java/gregtech/GT_Mod.java index 6d5c9e375c..f70dba6a18 100644 --- a/src/main/java/gregtech/GT_Mod.java +++ b/src/main/java/gregtech/GT_Mod.java @@ -12,6 +12,7 @@ import gregtech.api.enums.*; import gregtech.api.interfaces.internal.IGT_Mod; import gregtech.api.objects.ItemData; import gregtech.api.objects.XSTR; +import gregtech.api.threads.GT_Runnable_MachineBlockUpdate; import gregtech.api.util.*; import gregtech.common.GT_DummyWorld; import gregtech.common.GT_Network; @@ -1312,6 +1313,7 @@ public class GT_Mod implements IGT_Mod { e.printStackTrace(GT_Log.err); } } + GT_Runnable_MachineBlockUpdate.getINSTANCETHREAD().interrupt(); } private void addSolidFakeLargeBoilerFuels() { diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java index 0eed84ef2e..3bac8866c3 100644 --- a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java +++ b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java @@ -1,7 +1,6 @@ package gregtech.api.threads; import gregtech.api.GregTech_API; - import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable; @@ -28,7 +27,7 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { //Threading private static boolean allowedToRun; //makes if this thread is idle private static final Queue toUpdate = new ConcurrentLinkedQueue<>(); //blocks added while this thread ran - private static final Thread INSTANCETHREAD = new Thread(new GT_Runnable_MachineBlockUpdate()); //Instance of this thread + private static final Thread INSTANCETHREAD = new Thread(new GT_Runnable_MachineBlockUpdate(), "Machine Block Updates"); //Instance of this thread //This class should never be initiated outside of this class! private GT_Runnable_MachineBlockUpdate() { @@ -116,18 +115,35 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { return INSTANCETHREAD; } - private static void stepToUpdateMachine(World aWorld, int aX, int aY, int aZ, ArrayList aList) { - aList.add(new ChunkPosition(aX, aY, aZ)); - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); + private boolean shouldRecurse(TileEntity aTileEntity, int aX, int aY, int aZ) { + if (aTileEntity instanceof IGregTechTileEntity) { + // Stop recursion on GregTech cables, item pipes, and fluid pipes + IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aTileEntity).getMetaTileEntity(); + if ((tMetaTileEntity instanceof GT_MetaPipeEntity_Cable) || + (tMetaTileEntity instanceof GT_MetaPipeEntity_Fluid) || + (tMetaTileEntity instanceof GT_MetaPipeEntity_Item)) + return false; + } + + return (aTileEntity instanceof IMachineBlockUpdateable) || + GregTech_API.isMachineBlock(mWorld.getBlock(aX, aY, aZ), mWorld.getBlockMetadata(aX, aY, aZ)); + } + + private void stepToUpdateMachine(int aX, int aY, int aZ) { + if (!mVisited.add(new ChunkPosition(aX, aY, aZ))) + return; + + TileEntity tTileEntity = mWorld.getTileEntity(aX, aY, aZ); if (tTileEntity instanceof IMachineBlockUpdateable) ((IMachineBlockUpdateable) tTileEntity).onMachineBlockUpdate(); - if (aList.size() < 5 || (tTileEntity instanceof IMachineBlockUpdateable) || GregTech_API.isMachineBlock(aWorld.getBlock(aX, aY, aZ), aWorld.getBlockMetadata(aX, aY, aZ))) { - if (!aList.contains(new ChunkPosition(aX + 1, aY, aZ))) stepToUpdateMachine(aWorld, aX + 1, aY, aZ, aList); - if (!aList.contains(new ChunkPosition(aX - 1, aY, aZ))) stepToUpdateMachine(aWorld, aX - 1, aY, aZ, aList); - if (!aList.contains(new ChunkPosition(aX, aY + 1, aZ))) stepToUpdateMachine(aWorld, aX, aY + 1, aZ, aList); - if (!aList.contains(new ChunkPosition(aX, aY - 1, aZ))) stepToUpdateMachine(aWorld, aX, aY - 1, aZ, aList); - if (!aList.contains(new ChunkPosition(aX, aY, aZ + 1))) stepToUpdateMachine(aWorld, aX, aY, aZ + 1, aList); - if (!aList.contains(new ChunkPosition(aX, aY, aZ - 1))) stepToUpdateMachine(aWorld, aX, aY, aZ - 1, aList); + + if (mVisited.size() < 5 || shouldRecurse(tTileEntity, aX, aY, aZ)) { + stepToUpdateMachine(aX + 1, aY, aZ); + stepToUpdateMachine(aX - 1, aY, aZ); + stepToUpdateMachine(aX, aY + 1, aZ); + stepToUpdateMachine(aX, aY - 1, aZ); + stepToUpdateMachine(aX, aY, aZ + 1); + stepToUpdateMachine(aX, aY, aZ - 1); } } -- cgit From 72f84737e2ffee28590d35b1b3be2b656afd4fc7 Mon Sep 17 00:00:00 2001 From: bartimaeusnek <33183715+bartimaeusnek@users.noreply.github.com> Date: Tue, 14 Apr 2020 02:48:53 +0200 Subject: Made use of Thread.wait() + shortened "causeMachineUpdate" method Signed-off-by: bartimaeusnek <33183715+bartimaeusnek@users.noreply.github.com> --- src/main/java/gregtech/api/GregTech_API.java | 9 ++++----- .../api/threads/GT_Runnable_MachineBlockUpdate.java | 15 ++++++++++++++- 2 files changed, 18 insertions(+), 6 deletions(-) (limited to 'src/main/java/gregtech') diff --git a/src/main/java/gregtech/api/GregTech_API.java b/src/main/java/gregtech/api/GregTech_API.java index c7d02c7bed..68d8d6aaa8 100644 --- a/src/main/java/gregtech/api/GregTech_API.java +++ b/src/main/java/gregtech/api/GregTech_API.java @@ -389,12 +389,11 @@ public class GregTech_API { * @param aZ is the Z-Coord of the update causing Block */ public static boolean causeMachineUpdate(World aWorld, int aX, int aY, int aZ) { - if (!aWorld.isRemote && !GT_Runnable_MachineBlockUpdate.getINSTANCETHREAD().isAlive()) { - GT_Runnable_MachineBlockUpdate.setMachineUpdateValues(aWorld, aX, aY, aZ); - GT_Runnable_MachineBlockUpdate.getINSTANCETHREAD().start(); - return true; - } else if (!aWorld.isRemote && !GT_Runnable_MachineBlockUpdate.isAllowedToRun()){ + Thread updateThread = GT_Runnable_MachineBlockUpdate.getINSTANCETHREAD(); + if (!aWorld.isRemote) { GT_Runnable_MachineBlockUpdate.setMachineUpdateValues(aWorld, aX, aY, aZ); + if (!updateThread.isAlive()) + updateThread.start(); return true; } return false; diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java index 3bac8866c3..cefbb0bc8d 100644 --- a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java +++ b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java @@ -68,6 +68,10 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { GT_Runnable_MachineBlockUpdate.setmWorld(aWorld); GT_Runnable_MachineBlockUpdate.resetVisited(); GT_Runnable_MachineBlockUpdate.setAllowedToRun(true); + synchronized (GT_Runnable_MachineBlockUpdate.INSTANCETHREAD) { + if (GT_Runnable_MachineBlockUpdate.INSTANCETHREAD.getState() == Thread.State.WAITING) + GT_Runnable_MachineBlockUpdate.INSTANCETHREAD.notify(); + } } /** @@ -161,8 +165,17 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { //DO NOT USE OPTIONALS HERE! synchronized (toUpdate) { Coordinates coordinates = toUpdate.poll(); - if (coordinates != null) + if (coordinates != null) { coordinates.update(); + } else { + synchronized(INSTANCETHREAD) { + try { + INSTANCETHREAD.wait(); + } catch (InterruptedException ignored) { + return; + } + } + } } } } -- cgit From 78ab6155eeafa0e7b4494de3967343921d15eb82 Mon Sep 17 00:00:00 2001 From: bartimaeusnek <33183715+bartimaeusnek@users.noreply.github.com> Date: Tue, 14 Apr 2020 02:57:15 +0200 Subject: shortened the code + by using toUpdate as sync object Signed-off-by: bartimaeusnek <33183715+bartimaeusnek@users.noreply.github.com> --- .../api/threads/GT_Runnable_MachineBlockUpdate.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'src/main/java/gregtech') diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java index cefbb0bc8d..5e7081e3c2 100644 --- a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java +++ b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java @@ -68,9 +68,9 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { GT_Runnable_MachineBlockUpdate.setmWorld(aWorld); GT_Runnable_MachineBlockUpdate.resetVisited(); GT_Runnable_MachineBlockUpdate.setAllowedToRun(true); - synchronized (GT_Runnable_MachineBlockUpdate.INSTANCETHREAD) { + synchronized (toUpdate) { if (GT_Runnable_MachineBlockUpdate.INSTANCETHREAD.getState() == Thread.State.WAITING) - GT_Runnable_MachineBlockUpdate.INSTANCETHREAD.notify(); + GT_Runnable_MachineBlockUpdate.toUpdate.notify(); } } @@ -168,12 +168,10 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { if (coordinates != null) { coordinates.update(); } else { - synchronized(INSTANCETHREAD) { - try { - INSTANCETHREAD.wait(); - } catch (InterruptedException ignored) { - return; - } + try { + toUpdate.wait(); + } catch (InterruptedException ignored) { + return; } } } -- cgit From 9b05c6573762117ab1b60ef195e8be321b6e2bb8 Mon Sep 17 00:00:00 2001 From: bartimaeusnek <33183715+bartimaeusnek@users.noreply.github.com> Date: Tue, 14 Apr 2020 18:24:58 +0200 Subject: crashfix + Added a new Thread every time a world is loaded Signed-off-by: bartimaeusnek <33183715+bartimaeusnek@users.noreply.github.com> --- src/main/java/gregtech/GT_Mod.java | 3 ++ src/main/java/gregtech/api/GregTech_API.java | 3 -- .../threads/GT_Runnable_MachineBlockUpdate.java | 35 ++++++++++++---------- 3 files changed, 23 insertions(+), 18 deletions(-) (limited to 'src/main/java/gregtech') diff --git a/src/main/java/gregtech/GT_Mod.java b/src/main/java/gregtech/GT_Mod.java index f70dba6a18..9272ed20e2 100644 --- a/src/main/java/gregtech/GT_Mod.java +++ b/src/main/java/gregtech/GT_Mod.java @@ -1188,6 +1188,8 @@ public class GT_Mod implements IGT_Mod { } aEvent.registerServerCommand(new GT_Command()); + //Sets a new Machine Block Update Thread everytime a world is loaded + GT_Runnable_MachineBlockUpdate.initThread(); } public boolean isServerSide() { @@ -1313,6 +1315,7 @@ public class GT_Mod implements IGT_Mod { e.printStackTrace(GT_Log.err); } } + //Interrupt IDLE Threads to close down cleanly GT_Runnable_MachineBlockUpdate.getINSTANCETHREAD().interrupt(); } diff --git a/src/main/java/gregtech/api/GregTech_API.java b/src/main/java/gregtech/api/GregTech_API.java index 68d8d6aaa8..1cc19e7de4 100644 --- a/src/main/java/gregtech/api/GregTech_API.java +++ b/src/main/java/gregtech/api/GregTech_API.java @@ -389,11 +389,8 @@ public class GregTech_API { * @param aZ is the Z-Coord of the update causing Block */ public static boolean causeMachineUpdate(World aWorld, int aX, int aY, int aZ) { - Thread updateThread = GT_Runnable_MachineBlockUpdate.getINSTANCETHREAD(); if (!aWorld.isRemote) { GT_Runnable_MachineBlockUpdate.setMachineUpdateValues(aWorld, aX, aY, aZ); - if (!updateThread.isAlive()) - updateThread.start(); return true; } return false; diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java index 5e7081e3c2..c811f3a614 100644 --- a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java +++ b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java @@ -27,7 +27,7 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { //Threading private static boolean allowedToRun; //makes if this thread is idle private static final Queue toUpdate = new ConcurrentLinkedQueue<>(); //blocks added while this thread ran - private static final Thread INSTANCETHREAD = new Thread(new GT_Runnable_MachineBlockUpdate(), "Machine Block Updates"); //Instance of this thread + private static Thread INSTANCETHREAD; //Instance of this thread //This class should never be initiated outside of this class! private GT_Runnable_MachineBlockUpdate() { @@ -62,15 +62,15 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { * Never call this Method without checking if the thead is NOT allowed to run! */ private static void setMachineUpdateValuesUnsafe(World aWorld, int aX, int aY, int aZ){ - GT_Runnable_MachineBlockUpdate.setmZ(aZ); - GT_Runnable_MachineBlockUpdate.setmY(aY); - GT_Runnable_MachineBlockUpdate.setmX(aX); - GT_Runnable_MachineBlockUpdate.setmWorld(aWorld); - GT_Runnable_MachineBlockUpdate.resetVisited(); - GT_Runnable_MachineBlockUpdate.setAllowedToRun(true); + setmZ(aZ); + setmY(aY); + setmX(aX); + setmWorld(aWorld); + resetVisited(); + setAllowedToRun(true); synchronized (toUpdate) { - if (GT_Runnable_MachineBlockUpdate.INSTANCETHREAD.getState() == Thread.State.WAITING) - GT_Runnable_MachineBlockUpdate.toUpdate.notify(); + if (getINSTANCETHREAD().getState() == Thread.State.WAITING) + toUpdate.notify(); } } @@ -85,12 +85,12 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { } } - private static class Coordinates { + public static class Coordinates { - private final int mX; - private final int mY; - private final int mZ; - private final World mWorld; + protected final int mX; + protected final int mY; + protected final int mZ; + protected final World mWorld; public Coordinates(int mX, int mY, int mZ, World mWorld) { this.mX = mX; @@ -115,7 +115,12 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { GT_Runnable_MachineBlockUpdate.allowedToRun = unlocked; } - public static Thread getINSTANCETHREAD() { + public static synchronized void initThread() { + GT_Runnable_MachineBlockUpdate.INSTANCETHREAD = new Thread(new GT_Runnable_MachineBlockUpdate(), "GT Machine Block Updates"); + GT_Runnable_MachineBlockUpdate.INSTANCETHREAD.start(); + } + + public static synchronized Thread getINSTANCETHREAD() { return INSTANCETHREAD; } -- cgit From 4f30ef0f1abcb85d05170c769b757c3443e10d2b Mon Sep 17 00:00:00 2001 From: Technus Date: Wed, 15 Apr 2020 19:01:06 +0200 Subject: Refactor to fixed thread pool executor Use actually something made for this task... --- src/main/java/gregtech/GT_Mod.java | 5 +- .../interfaces/metatileentity/IMetaTileEntity.java | 26 ++- .../interfaces/tileentity/IGregTechTileEntity.java | 21 ++ .../tileentity/IMachineBlockUpdateable.java | 7 + .../api/metatileentity/BaseMetaPipeEntity.java | 11 ++ .../api/metatileentity/BaseMetaTileEntity.java | 11 ++ .../api/metatileentity/MetaPipeEntity.java | 4 + .../api/metatileentity/MetaTileEntity.java | 1 - .../implementations/GT_MetaPipeEntity_Frame.java | 5 + .../threads/GT_Runnable_MachineBlockUpdate.java | 217 ++++++++------------- 10 files changed, 161 insertions(+), 147 deletions(-) (limited to 'src/main/java/gregtech') diff --git a/src/main/java/gregtech/GT_Mod.java b/src/main/java/gregtech/GT_Mod.java index 9272ed20e2..22b677337e 100644 --- a/src/main/java/gregtech/GT_Mod.java +++ b/src/main/java/gregtech/GT_Mod.java @@ -1189,7 +1189,7 @@ public class GT_Mod implements IGT_Mod { aEvent.registerServerCommand(new GT_Command()); //Sets a new Machine Block Update Thread everytime a world is loaded - GT_Runnable_MachineBlockUpdate.initThread(); + GT_Runnable_MachineBlockUpdate.initExecutorService(); } public boolean isServerSide() { @@ -1232,7 +1232,6 @@ public class GT_Mod implements IGT_Mod { @Mod.EventHandler public void onServerStopping(FMLServerStoppingEvent aEvent) { - for (Runnable tRunnable : GregTech_API.sBeforeGTServerstop) { try { tRunnable.run(); @@ -1316,7 +1315,7 @@ public class GT_Mod implements IGT_Mod { } } //Interrupt IDLE Threads to close down cleanly - GT_Runnable_MachineBlockUpdate.getINSTANCETHREAD().interrupt(); + GT_Runnable_MachineBlockUpdate.shutdownExecutorService(); } private void addSolidFakeLargeBoilerFuels() { diff --git a/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntity.java b/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntity.java index a518b3baaf..f0ca426616 100644 --- a/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntity.java +++ b/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntity.java @@ -5,6 +5,7 @@ import cpw.mods.fml.relauncher.SideOnly; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.tileentity.IGearEnergyTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable; import gregtech.api.objects.GT_ItemStack; import gregtech.api.util.GT_Config; import net.minecraft.block.Block; @@ -31,7 +32,7 @@ import java.util.List; *

* Don't implement this yourself and expect it to work. Extend @MetaTileEntity itself. */ -public interface IMetaTileEntity extends ISidedInventory, IFluidTank, IFluidHandler, IGearEnergyTileEntity { +public interface IMetaTileEntity extends ISidedInventory, IFluidTank, IFluidHandler, IGearEnergyTileEntity, IMachineBlockUpdateable { /** * This determines the BaseMetaTileEntity belonging to this MetaTileEntity by using the Meta ID of the Block itself. *

@@ -233,11 +234,6 @@ public interface IMetaTileEntity extends ISidedInventory, IFluidTank, IFluidHand */ boolean isAccessAllowed(EntityPlayer aPlayer); - /** - * When a Machine Update occurs - */ - void onMachineBlockUpdate(); - /** * a Player rightclicks the Machine * Sneaky rightclicks are not getting passed to this! @@ -408,4 +404,22 @@ public interface IMetaTileEntity extends ISidedInventory, IFluidTank, IFluidHand String getAlternativeModeText(); boolean shouldJoinIc2Enet(); + + /** + * The Machine Update, which is called when the Machine needs an Update of its Parts. + * I suggest to wait 1-5 seconds before actually checking the Machine Parts. + * RP-Frames could for example cause Problems when you instacheck the Machine Parts. + * + * just do stuff since we are already in meta tile... + */ + @Override + void onMachineBlockUpdate(); + + /** + * just return in should recurse since we are already in meta tile... + */ + @Override + default boolean isMachineBlockUpdateRecursive(){ + return true; + } } diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IGregTechTileEntity.java b/src/main/java/gregtech/api/interfaces/tileentity/IGregTechTileEntity.java index af9ead9543..8e135fbc85 100644 --- a/src/main/java/gregtech/api/interfaces/tileentity/IGregTechTileEntity.java +++ b/src/main/java/gregtech/api/interfaces/tileentity/IGregTechTileEntity.java @@ -135,4 +135,25 @@ public interface IGregTechTileEntity extends ITexturedTileEntity, IGearEnergyTil AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ); void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity collider); + + /** + * Checks validity of meta tile and delegates to it + */ + @Override + default void onMachineBlockUpdate(){ + if(!isDead() && getMetaTileEntity()!=null && + getMetaTileEntity().getBaseMetaTileEntity()==this){ + getMetaTileEntity().onMachineBlockUpdate(); + } + } + + /** + * Checks validity of meta tile and delegates to it + */ + @Override + default boolean isMachineBlockUpdateRecursive() { + return !isDead() && getMetaTileEntity()!=null && + getMetaTileEntity().getBaseMetaTileEntity()==this && + getMetaTileEntity().isMachineBlockUpdateRecursive(); + } } \ No newline at end of file diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IMachineBlockUpdateable.java b/src/main/java/gregtech/api/interfaces/tileentity/IMachineBlockUpdateable.java index c7f6fe5f23..31590f3d57 100644 --- a/src/main/java/gregtech/api/interfaces/tileentity/IMachineBlockUpdateable.java +++ b/src/main/java/gregtech/api/interfaces/tileentity/IMachineBlockUpdateable.java @@ -13,4 +13,11 @@ public interface IMachineBlockUpdateable { * RP-Frames could for example cause Problems when you instacheck the Machine Parts. */ void onMachineBlockUpdate(); + + /** + * Should recurse? + */ + default boolean isMachineBlockUpdateRecursive(){ + return true; + } } diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java index 881d4a814e..ae8fc7324d 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java @@ -584,11 +584,22 @@ public class BaseMetaPipeEntity extends BaseTileEntity implements IGregTechTileE return stack; } + /** + * Checks validity of meta tile and delegates to it + */ @Override public void onMachineBlockUpdate() { if (canAccessData()) mMetaTileEntity.onMachineBlockUpdate(); } + /** + * Checks validity of meta tile and delegates to it + */ + @Override + public boolean isMachineBlockUpdateRecursive() { + return canAccessData() && mMetaTileEntity.isMachineBlockUpdateRecursive(); + } + @Override public int getProgress() { return canAccessData() ? mMetaTileEntity.getProgresstime() : 0; diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java index 58a97f644a..1ae88ade41 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java @@ -913,11 +913,22 @@ public class BaseMetaTileEntity extends BaseTileEntity implements IGregTechTileE return stack; } + /** + * Checks validity of meta tile and delegates to it + */ @Override public void onMachineBlockUpdate() { if (canAccessData()) mMetaTileEntity.onMachineBlockUpdate(); } + /** + * Checks validity of meta tile and delegates to it + */ + @Override + public boolean isMachineBlockUpdateRecursive() { + return canAccessData() && mMetaTileEntity.isMachineBlockUpdateRecursive(); + } + @Override public int getProgress() { return canAccessData() ? mMetaTileEntity.getProgresstime() : 0; diff --git a/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java b/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java index 6614cca210..9fa16b9890 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java @@ -840,4 +840,8 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { public boolean shouldJoinIc2Enet() { return false; } + @Override + public boolean isMachineBlockUpdateRecursive() { + return false; + } } diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java index 1753d2677c..d08a8d9da5 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java @@ -85,7 +85,6 @@ public abstract class MetaTileEntity implements IMetaTileEntity { getBaseMetaTileEntity().setMetaTileID((short) aID); GT_LanguageManager.addStringLocalization("gt.blockmachines." + mName + ".name", aRegionalName); mInventory = new ItemStack[aInvSlotCount]; - } /** diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Frame.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Frame.java index 9db9ad910e..7074d63422 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Frame.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Frame.java @@ -97,4 +97,9 @@ public class GT_MetaPipeEntity_Frame extends MetaPipeEntity { @Override public void disconnect(byte aSide) {/* Do nothing*/} + + @Override + public boolean isMachineBlockUpdateRecursive() { + return true; + } } \ No newline at end of file diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java index c811f3a614..d4b5226b96 100644 --- a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java +++ b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java @@ -1,152 +1,90 @@ package gregtech.api.threads; +import gregtech.GT_Mod; import gregtech.api.GregTech_API; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Item; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; import java.util.HashSet; -import java.util.Queue; import java.util.Set; -import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; public class GT_Runnable_MachineBlockUpdate implements Runnable { - - private static int mX; - private static int mY; - private static int mZ; - private static World mWorld; - private static final Set mVisited = new HashSet<>(80); + //used by runner thread + private int x, y, z; + private World world; + private final Set visited = new HashSet<>(80); //Threading - private static boolean allowedToRun; //makes if this thread is idle - private static final Queue toUpdate = new ConcurrentLinkedQueue<>(); //blocks added while this thread ran - private static Thread INSTANCETHREAD; //Instance of this thread + private static final ThreadFactory THREAD_FACTORY= r -> { + Thread thread=new Thread(r); + thread.setName("GT_MachineBlockUpdate"); + return thread; + }; + private static ExecutorService EXECUTOR_SERVICE; //This class should never be initiated outside of this class! - private GT_Runnable_MachineBlockUpdate() { - } - - public static synchronized void setmX(int mX) { - GT_Runnable_MachineBlockUpdate.mX = mX; - } - - public static synchronized void setmY(int mY) { - GT_Runnable_MachineBlockUpdate.mY = mY; - } - - public static synchronized void setmZ(int mZ) { - GT_Runnable_MachineBlockUpdate.mZ = mZ; - } - - public static synchronized void setmWorld(World mWorld) { - GT_Runnable_MachineBlockUpdate.mWorld = mWorld; + private GT_Runnable_MachineBlockUpdate(World aWorld, int aX, int aY, int aZ) { + this.world = aWorld; + this.x = aX; + this.y = aY; + this.z = aZ; } /** - * Clears the mVisited HashSet + * If the thread is idle, sets new values and remove the idle flag, otherwise, queue the cooridinates. */ - public static synchronized void resetVisited() { - synchronized (GT_Runnable_MachineBlockUpdate.mVisited) { - GT_Runnable_MachineBlockUpdate.mVisited.clear(); - } + public static void setMachineUpdateValues(World aWorld, int aX, int aY, int aZ) { + EXECUTOR_SERVICE.submit(new GT_Runnable_MachineBlockUpdate(aWorld,aX,aY,aZ)); } - /** - * Never call this Method without checking if the thead is NOT allowed to run! - */ - private static void setMachineUpdateValuesUnsafe(World aWorld, int aX, int aY, int aZ){ - setmZ(aZ); - setmY(aY); - setmX(aX); - setmWorld(aWorld); - resetVisited(); - setAllowedToRun(true); - synchronized (toUpdate) { - if (getINSTANCETHREAD().getState() == Thread.State.WAITING) - toUpdate.notify(); - } + public static void initExecutorService() { + EXECUTOR_SERVICE = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(),THREAD_FACTORY); + //Executors.newSingleThreadExecutor(THREAD_FACTORY); + //Executors.newCachedThreadPool(THREAD_FACTORY); + //Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(),THREAD_FACTORY); } - /** - * If the thread is idleing, sets new values and remove the idle flag, otherwise, queue the cooridinates. - */ - public static synchronized void setMachineUpdateValues(World aWorld, int aX, int aY, int aZ) { - if (GT_Runnable_MachineBlockUpdate.isAllowedToRun()) { - toUpdate.add(new Coordinates(aX, aY, aZ, aWorld)); - } else { - GT_Runnable_MachineBlockUpdate.setMachineUpdateValuesUnsafe(aWorld, aX, aY, aZ); - } - } - - public static class Coordinates { - - protected final int mX; - protected final int mY; - protected final int mZ; - protected final World mWorld; - - public Coordinates(int mX, int mY, int mZ, World mWorld) { - this.mX = mX; - this.mY = mY; - this.mZ = mZ; - this.mWorld = mWorld; - } - - /** - * Updated the Main Update Thread while its Idle - */ - public void update() { - GT_Runnable_MachineBlockUpdate.setMachineUpdateValues(this.mWorld,this.mX,this.mY,this.mZ); + public static void shutdownExecutorService() { + try { + EXECUTOR_SERVICE.awaitTermination(60, TimeUnit.SECONDS); + } catch (InterruptedException e) { + GT_Mod.GT_FML_LOGGER.error("Well this interruption got interrupted...", e); } - } - - public static synchronized boolean isAllowedToRun() { - return allowedToRun; - } - - public static synchronized void setAllowedToRun(boolean unlocked) { - GT_Runnable_MachineBlockUpdate.allowedToRun = unlocked; - } - - public static synchronized void initThread() { - GT_Runnable_MachineBlockUpdate.INSTANCETHREAD = new Thread(new GT_Runnable_MachineBlockUpdate(), "GT Machine Block Updates"); - GT_Runnable_MachineBlockUpdate.INSTANCETHREAD.start(); - } - - public static synchronized Thread getINSTANCETHREAD() { - return INSTANCETHREAD; + //terminates executor permanently + EXECUTOR_SERVICE.shutdownNow(); } private boolean shouldRecurse(TileEntity aTileEntity, int aX, int aY, int aZ) { - if (aTileEntity instanceof IGregTechTileEntity) { - // Stop recursion on GregTech cables, item pipes, and fluid pipes - IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aTileEntity).getMetaTileEntity(); - if ((tMetaTileEntity instanceof GT_MetaPipeEntity_Cable) || - (tMetaTileEntity instanceof GT_MetaPipeEntity_Fluid) || - (tMetaTileEntity instanceof GT_MetaPipeEntity_Item)) - return false; + //no check on IGregTechTileEntity as it should call the underlying meta tile isMachineBlockUpdateRecursive + //if (aTileEntity instanceof IGregTechTileEntity) { + // return ((IGregTechTileEntity) aTileEntity).isMachineBlockUpdateRecursive(); + //} + return (aTileEntity instanceof IMachineBlockUpdateable && + ((IMachineBlockUpdateable) aTileEntity).isMachineBlockUpdateRecursive()) || + GregTech_API.isMachineBlock(world.getBlock(aX, aY, aZ), world.getBlockMetadata(aX, aY, aZ)); + } + + private void causeUpdate(TileEntity tileEntity){ + //no check for IGregTechTileEntity as it should call the underlying meta tile onMachineBlockUpdate + if (tileEntity instanceof IMachineBlockUpdateable) { + ((IMachineBlockUpdateable) tileEntity).onMachineBlockUpdate(); } - - return (aTileEntity instanceof IMachineBlockUpdateable) || - GregTech_API.isMachineBlock(mWorld.getBlock(aX, aY, aZ), mWorld.getBlockMetadata(aX, aY, aZ)); } private void stepToUpdateMachine(int aX, int aY, int aZ) { - if (!mVisited.add(new ChunkPosition(aX, aY, aZ))) + if (!visited.add(new ChunkPosition(aX, aY, aZ))) return; + TileEntity tTileEntity = world.getTileEntity(aX, aY, aZ); - TileEntity tTileEntity = mWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IMachineBlockUpdateable) - ((IMachineBlockUpdateable) tTileEntity).onMachineBlockUpdate(); + causeUpdate(tTileEntity); - if (mVisited.size() < 5 || shouldRecurse(tTileEntity, aX, aY, aZ)) { + if (visited.size() < 5 || shouldRecurse(tTileEntity, aX, aY, aZ)) { stepToUpdateMachine(aX + 1, aY, aZ); stepToUpdateMachine(aX - 1, aY, aZ); stepToUpdateMachine(aX, aY + 1, aZ); @@ -154,33 +92,38 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { stepToUpdateMachine(aX, aY, aZ + 1); stepToUpdateMachine(aX, aY, aZ - 1); } - } @Override public void run() { - for(;;) { //infinite loop - if (isAllowedToRun()) {//Are we ready to work? - try { - stepToUpdateMachine(mX, mY, mZ); - } catch (Throwable e) {/**/} - setAllowedToRun(false); //Work is finished, wait for new Coords. - } else { - //Checkes if the Update Queue has members - //DO NOT USE OPTIONALS HERE! - synchronized (toUpdate) { - Coordinates coordinates = toUpdate.poll(); - if (coordinates != null) { - coordinates.update(); - } else { - try { - toUpdate.wait(); - } catch (InterruptedException ignored) { - return; - } - } - } - } + try { + stepToUpdateMachine(x, y, z); + } catch (Exception e) { + GT_Mod.GT_FML_LOGGER.error("Well this update was broken... " + new Coordinates(x,y,z,world), e); + } + } + + public static class Coordinates { + public final int mX; + public final int mY; + public final int mZ; + public final World mWorld; + + public Coordinates(int mX, int mY, int mZ, World mWorld) { + this.mX = mX; + this.mY = mY; + this.mZ = mZ; + this.mWorld = mWorld; + } + + @Override + public String toString() { + return "Coordinates{" + + "mX=" + mX + + ", mY=" + mY + + ", mZ=" + mZ + + ", mWorld=" + mWorld.getProviderName()+ " @dimId " + mWorld.provider.dimensionId + + '}'; } } } \ No newline at end of file -- cgit From 9bef8b3a8a8270db9c289c05c998e71273ca20fc Mon Sep 17 00:00:00 2001 From: Technus Date: Wed, 15 Apr 2020 19:01:06 +0200 Subject: Refactor to fixed thread pool executor Use actually something made for this task... --- src/main/java/gregtech/GT_Mod.java | 5 +- .../interfaces/metatileentity/IMetaTileEntity.java | 26 ++- .../interfaces/tileentity/IGregTechTileEntity.java | 21 ++ .../tileentity/IMachineBlockUpdateable.java | 7 + .../api/metatileentity/BaseMetaPipeEntity.java | 11 ++ .../api/metatileentity/BaseMetaTileEntity.java | 11 ++ .../api/metatileentity/MetaPipeEntity.java | 4 + .../api/metatileentity/MetaTileEntity.java | 1 - .../implementations/GT_MetaPipeEntity_Frame.java | 5 + .../threads/GT_Runnable_MachineBlockUpdate.java | 217 ++++++++------------- 10 files changed, 161 insertions(+), 147 deletions(-) (limited to 'src/main/java/gregtech') diff --git a/src/main/java/gregtech/GT_Mod.java b/src/main/java/gregtech/GT_Mod.java index 9272ed20e2..22b677337e 100644 --- a/src/main/java/gregtech/GT_Mod.java +++ b/src/main/java/gregtech/GT_Mod.java @@ -1189,7 +1189,7 @@ public class GT_Mod implements IGT_Mod { aEvent.registerServerCommand(new GT_Command()); //Sets a new Machine Block Update Thread everytime a world is loaded - GT_Runnable_MachineBlockUpdate.initThread(); + GT_Runnable_MachineBlockUpdate.initExecutorService(); } public boolean isServerSide() { @@ -1232,7 +1232,6 @@ public class GT_Mod implements IGT_Mod { @Mod.EventHandler public void onServerStopping(FMLServerStoppingEvent aEvent) { - for (Runnable tRunnable : GregTech_API.sBeforeGTServerstop) { try { tRunnable.run(); @@ -1316,7 +1315,7 @@ public class GT_Mod implements IGT_Mod { } } //Interrupt IDLE Threads to close down cleanly - GT_Runnable_MachineBlockUpdate.getINSTANCETHREAD().interrupt(); + GT_Runnable_MachineBlockUpdate.shutdownExecutorService(); } private void addSolidFakeLargeBoilerFuels() { diff --git a/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntity.java b/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntity.java index a518b3baaf..f0ca426616 100644 --- a/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntity.java +++ b/src/main/java/gregtech/api/interfaces/metatileentity/IMetaTileEntity.java @@ -5,6 +5,7 @@ import cpw.mods.fml.relauncher.SideOnly; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.tileentity.IGearEnergyTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable; import gregtech.api.objects.GT_ItemStack; import gregtech.api.util.GT_Config; import net.minecraft.block.Block; @@ -31,7 +32,7 @@ import java.util.List; *

* Don't implement this yourself and expect it to work. Extend @MetaTileEntity itself. */ -public interface IMetaTileEntity extends ISidedInventory, IFluidTank, IFluidHandler, IGearEnergyTileEntity { +public interface IMetaTileEntity extends ISidedInventory, IFluidTank, IFluidHandler, IGearEnergyTileEntity, IMachineBlockUpdateable { /** * This determines the BaseMetaTileEntity belonging to this MetaTileEntity by using the Meta ID of the Block itself. *

@@ -233,11 +234,6 @@ public interface IMetaTileEntity extends ISidedInventory, IFluidTank, IFluidHand */ boolean isAccessAllowed(EntityPlayer aPlayer); - /** - * When a Machine Update occurs - */ - void onMachineBlockUpdate(); - /** * a Player rightclicks the Machine * Sneaky rightclicks are not getting passed to this! @@ -408,4 +404,22 @@ public interface IMetaTileEntity extends ISidedInventory, IFluidTank, IFluidHand String getAlternativeModeText(); boolean shouldJoinIc2Enet(); + + /** + * The Machine Update, which is called when the Machine needs an Update of its Parts. + * I suggest to wait 1-5 seconds before actually checking the Machine Parts. + * RP-Frames could for example cause Problems when you instacheck the Machine Parts. + * + * just do stuff since we are already in meta tile... + */ + @Override + void onMachineBlockUpdate(); + + /** + * just return in should recurse since we are already in meta tile... + */ + @Override + default boolean isMachineBlockUpdateRecursive(){ + return true; + } } diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IGregTechTileEntity.java b/src/main/java/gregtech/api/interfaces/tileentity/IGregTechTileEntity.java index af9ead9543..8e135fbc85 100644 --- a/src/main/java/gregtech/api/interfaces/tileentity/IGregTechTileEntity.java +++ b/src/main/java/gregtech/api/interfaces/tileentity/IGregTechTileEntity.java @@ -135,4 +135,25 @@ public interface IGregTechTileEntity extends ITexturedTileEntity, IGearEnergyTil AxisAlignedBB getCollisionBoundingBoxFromPool(World aWorld, int aX, int aY, int aZ); void onEntityCollidedWithBlock(World aWorld, int aX, int aY, int aZ, Entity collider); + + /** + * Checks validity of meta tile and delegates to it + */ + @Override + default void onMachineBlockUpdate(){ + if(!isDead() && getMetaTileEntity()!=null && + getMetaTileEntity().getBaseMetaTileEntity()==this){ + getMetaTileEntity().onMachineBlockUpdate(); + } + } + + /** + * Checks validity of meta tile and delegates to it + */ + @Override + default boolean isMachineBlockUpdateRecursive() { + return !isDead() && getMetaTileEntity()!=null && + getMetaTileEntity().getBaseMetaTileEntity()==this && + getMetaTileEntity().isMachineBlockUpdateRecursive(); + } } \ No newline at end of file diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IMachineBlockUpdateable.java b/src/main/java/gregtech/api/interfaces/tileentity/IMachineBlockUpdateable.java index c7f6fe5f23..31590f3d57 100644 --- a/src/main/java/gregtech/api/interfaces/tileentity/IMachineBlockUpdateable.java +++ b/src/main/java/gregtech/api/interfaces/tileentity/IMachineBlockUpdateable.java @@ -13,4 +13,11 @@ public interface IMachineBlockUpdateable { * RP-Frames could for example cause Problems when you instacheck the Machine Parts. */ void onMachineBlockUpdate(); + + /** + * Should recurse? + */ + default boolean isMachineBlockUpdateRecursive(){ + return true; + } } diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java index 881d4a814e..ae8fc7324d 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java @@ -584,11 +584,22 @@ public class BaseMetaPipeEntity extends BaseTileEntity implements IGregTechTileE return stack; } + /** + * Checks validity of meta tile and delegates to it + */ @Override public void onMachineBlockUpdate() { if (canAccessData()) mMetaTileEntity.onMachineBlockUpdate(); } + /** + * Checks validity of meta tile and delegates to it + */ + @Override + public boolean isMachineBlockUpdateRecursive() { + return canAccessData() && mMetaTileEntity.isMachineBlockUpdateRecursive(); + } + @Override public int getProgress() { return canAccessData() ? mMetaTileEntity.getProgresstime() : 0; diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java index 58a97f644a..1ae88ade41 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java @@ -913,11 +913,22 @@ public class BaseMetaTileEntity extends BaseTileEntity implements IGregTechTileE return stack; } + /** + * Checks validity of meta tile and delegates to it + */ @Override public void onMachineBlockUpdate() { if (canAccessData()) mMetaTileEntity.onMachineBlockUpdate(); } + /** + * Checks validity of meta tile and delegates to it + */ + @Override + public boolean isMachineBlockUpdateRecursive() { + return canAccessData() && mMetaTileEntity.isMachineBlockUpdateRecursive(); + } + @Override public int getProgress() { return canAccessData() ? mMetaTileEntity.getProgresstime() : 0; diff --git a/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java b/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java index 6614cca210..9fa16b9890 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java @@ -840,4 +840,8 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable { public boolean shouldJoinIc2Enet() { return false; } + @Override + public boolean isMachineBlockUpdateRecursive() { + return false; + } } diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java index 1753d2677c..d08a8d9da5 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java @@ -85,7 +85,6 @@ public abstract class MetaTileEntity implements IMetaTileEntity { getBaseMetaTileEntity().setMetaTileID((short) aID); GT_LanguageManager.addStringLocalization("gt.blockmachines." + mName + ".name", aRegionalName); mInventory = new ItemStack[aInvSlotCount]; - } /** diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Frame.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Frame.java index 9db9ad910e..7074d63422 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Frame.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Frame.java @@ -97,4 +97,9 @@ public class GT_MetaPipeEntity_Frame extends MetaPipeEntity { @Override public void disconnect(byte aSide) {/* Do nothing*/} + + @Override + public boolean isMachineBlockUpdateRecursive() { + return true; + } } \ No newline at end of file diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java index c811f3a614..fedf13673d 100644 --- a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java +++ b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java @@ -1,152 +1,90 @@ package gregtech.api.threads; +import gregtech.GT_Mod; import gregtech.api.GregTech_API; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.interfaces.tileentity.IMachineBlockUpdateable; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Cable; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid; -import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Item; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; import java.util.HashSet; -import java.util.Queue; import java.util.Set; -import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; public class GT_Runnable_MachineBlockUpdate implements Runnable { - - private static int mX; - private static int mY; - private static int mZ; - private static World mWorld; - private static final Set mVisited = new HashSet<>(80); + //used by runner thread + private final int x, y, z; + private final World world; + private final Set visited = new HashSet<>(80); //Threading - private static boolean allowedToRun; //makes if this thread is idle - private static final Queue toUpdate = new ConcurrentLinkedQueue<>(); //blocks added while this thread ran - private static Thread INSTANCETHREAD; //Instance of this thread + private static final ThreadFactory THREAD_FACTORY= r -> { + Thread thread=new Thread(r); + thread.setName("GT_MachineBlockUpdate"); + return thread; + }; + private static ExecutorService EXECUTOR_SERVICE; //This class should never be initiated outside of this class! - private GT_Runnable_MachineBlockUpdate() { - } - - public static synchronized void setmX(int mX) { - GT_Runnable_MachineBlockUpdate.mX = mX; - } - - public static synchronized void setmY(int mY) { - GT_Runnable_MachineBlockUpdate.mY = mY; - } - - public static synchronized void setmZ(int mZ) { - GT_Runnable_MachineBlockUpdate.mZ = mZ; - } - - public static synchronized void setmWorld(World mWorld) { - GT_Runnable_MachineBlockUpdate.mWorld = mWorld; + private GT_Runnable_MachineBlockUpdate(World aWorld, int aX, int aY, int aZ) { + this.world = aWorld; + this.x = aX; + this.y = aY; + this.z = aZ; } /** - * Clears the mVisited HashSet + * If the thread is idle, sets new values and remove the idle flag, otherwise, queue the cooridinates. */ - public static synchronized void resetVisited() { - synchronized (GT_Runnable_MachineBlockUpdate.mVisited) { - GT_Runnable_MachineBlockUpdate.mVisited.clear(); - } + public static void setMachineUpdateValues(World aWorld, int aX, int aY, int aZ) { + EXECUTOR_SERVICE.submit(new GT_Runnable_MachineBlockUpdate(aWorld,aX,aY,aZ)); } - /** - * Never call this Method without checking if the thead is NOT allowed to run! - */ - private static void setMachineUpdateValuesUnsafe(World aWorld, int aX, int aY, int aZ){ - setmZ(aZ); - setmY(aY); - setmX(aX); - setmWorld(aWorld); - resetVisited(); - setAllowedToRun(true); - synchronized (toUpdate) { - if (getINSTANCETHREAD().getState() == Thread.State.WAITING) - toUpdate.notify(); - } + public static void initExecutorService() { + EXECUTOR_SERVICE = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(),THREAD_FACTORY); + //Executors.newSingleThreadExecutor(THREAD_FACTORY); + //Executors.newCachedThreadPool(THREAD_FACTORY); + //Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(),THREAD_FACTORY); } - /** - * If the thread is idleing, sets new values and remove the idle flag, otherwise, queue the cooridinates. - */ - public static synchronized void setMachineUpdateValues(World aWorld, int aX, int aY, int aZ) { - if (GT_Runnable_MachineBlockUpdate.isAllowedToRun()) { - toUpdate.add(new Coordinates(aX, aY, aZ, aWorld)); - } else { - GT_Runnable_MachineBlockUpdate.setMachineUpdateValuesUnsafe(aWorld, aX, aY, aZ); - } - } - - public static class Coordinates { - - protected final int mX; - protected final int mY; - protected final int mZ; - protected final World mWorld; - - public Coordinates(int mX, int mY, int mZ, World mWorld) { - this.mX = mX; - this.mY = mY; - this.mZ = mZ; - this.mWorld = mWorld; - } - - /** - * Updated the Main Update Thread while its Idle - */ - public void update() { - GT_Runnable_MachineBlockUpdate.setMachineUpdateValues(this.mWorld,this.mX,this.mY,this.mZ); + public static void shutdownExecutorService() { + try { + EXECUTOR_SERVICE.awaitTermination(60, TimeUnit.SECONDS); + } catch (InterruptedException e) { + GT_Mod.GT_FML_LOGGER.error("Well this interruption got interrupted...", e); } - } - - public static synchronized boolean isAllowedToRun() { - return allowedToRun; - } - - public static synchronized void setAllowedToRun(boolean unlocked) { - GT_Runnable_MachineBlockUpdate.allowedToRun = unlocked; - } - - public static synchronized void initThread() { - GT_Runnable_MachineBlockUpdate.INSTANCETHREAD = new Thread(new GT_Runnable_MachineBlockUpdate(), "GT Machine Block Updates"); - GT_Runnable_MachineBlockUpdate.INSTANCETHREAD.start(); - } - - public static synchronized Thread getINSTANCETHREAD() { - return INSTANCETHREAD; + //terminates executor permanently + EXECUTOR_SERVICE.shutdownNow(); } private boolean shouldRecurse(TileEntity aTileEntity, int aX, int aY, int aZ) { - if (aTileEntity instanceof IGregTechTileEntity) { - // Stop recursion on GregTech cables, item pipes, and fluid pipes - IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aTileEntity).getMetaTileEntity(); - if ((tMetaTileEntity instanceof GT_MetaPipeEntity_Cable) || - (tMetaTileEntity instanceof GT_MetaPipeEntity_Fluid) || - (tMetaTileEntity instanceof GT_MetaPipeEntity_Item)) - return false; + //no check on IGregTechTileEntity as it should call the underlying meta tile isMachineBlockUpdateRecursive + //if (aTileEntity instanceof IGregTechTileEntity) { + // return ((IGregTechTileEntity) aTileEntity).isMachineBlockUpdateRecursive(); + //} + return (aTileEntity instanceof IMachineBlockUpdateable && + ((IMachineBlockUpdateable) aTileEntity).isMachineBlockUpdateRecursive()) || + GregTech_API.isMachineBlock(world.getBlock(aX, aY, aZ), world.getBlockMetadata(aX, aY, aZ)); + } + + private void causeUpdate(TileEntity tileEntity){ + //no check for IGregTechTileEntity as it should call the underlying meta tile onMachineBlockUpdate + if (tileEntity instanceof IMachineBlockUpdateable) { + ((IMachineBlockUpdateable) tileEntity).onMachineBlockUpdate(); } - - return (aTileEntity instanceof IMachineBlockUpdateable) || - GregTech_API.isMachineBlock(mWorld.getBlock(aX, aY, aZ), mWorld.getBlockMetadata(aX, aY, aZ)); } private void stepToUpdateMachine(int aX, int aY, int aZ) { - if (!mVisited.add(new ChunkPosition(aX, aY, aZ))) + if (!visited.add(new ChunkPosition(aX, aY, aZ))) return; + TileEntity tTileEntity = world.getTileEntity(aX, aY, aZ); - TileEntity tTileEntity = mWorld.getTileEntity(aX, aY, aZ); - if (tTileEntity instanceof IMachineBlockUpdateable) - ((IMachineBlockUpdateable) tTileEntity).onMachineBlockUpdate(); + causeUpdate(tTileEntity); - if (mVisited.size() < 5 || shouldRecurse(tTileEntity, aX, aY, aZ)) { + if (visited.size() < 5 || shouldRecurse(tTileEntity, aX, aY, aZ)) { stepToUpdateMachine(aX + 1, aY, aZ); stepToUpdateMachine(aX - 1, aY, aZ); stepToUpdateMachine(aX, aY + 1, aZ); @@ -154,33 +92,38 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { stepToUpdateMachine(aX, aY, aZ + 1); stepToUpdateMachine(aX, aY, aZ - 1); } - } @Override public void run() { - for(;;) { //infinite loop - if (isAllowedToRun()) {//Are we ready to work? - try { - stepToUpdateMachine(mX, mY, mZ); - } catch (Throwable e) {/**/} - setAllowedToRun(false); //Work is finished, wait for new Coords. - } else { - //Checkes if the Update Queue has members - //DO NOT USE OPTIONALS HERE! - synchronized (toUpdate) { - Coordinates coordinates = toUpdate.poll(); - if (coordinates != null) { - coordinates.update(); - } else { - try { - toUpdate.wait(); - } catch (InterruptedException ignored) { - return; - } - } - } - } + try { + stepToUpdateMachine(x, y, z); + } catch (Exception e) { + GT_Mod.GT_FML_LOGGER.error("Well this update was broken... " + new Coordinates(x,y,z,world), e); + } + } + + public static class Coordinates { + public final int mX; + public final int mY; + public final int mZ; + public final World mWorld; + + public Coordinates(int mX, int mY, int mZ, World mWorld) { + this.mX = mX; + this.mY = mY; + this.mZ = mZ; + this.mWorld = mWorld; + } + + @Override + public String toString() { + return "Coordinates{" + + "mX=" + mX + + ", mY=" + mY + + ", mZ=" + mZ + + ", mWorld=" + mWorld.getProviderName()+ " @dimId " + mWorld.provider.dimensionId + + '}'; } } } \ No newline at end of file -- cgit From 3d505da7be11fd7952919be3d99db96f21c55338 Mon Sep 17 00:00:00 2001 From: Technus Date: Thu, 16 Apr 2020 06:39:39 +0200 Subject: disable threaded caching of mUpdate values --- .../implementations/GT_MetaTileEntity_MultiBlockBase.java | 3 ++- .../machines/multi/GT_MetaTileEntity_PrimitiveBlastFurnace.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'src/main/java/gregtech') diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java index da80a9e231..3efbe0d57b 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java @@ -33,7 +33,8 @@ public abstract class GT_MetaTileEntity_MultiBlockBase extends MetaTileEntity { public static boolean disableMaintenance; public boolean mMachine = false, mWrench = false, mScrewdriver = false, mSoftHammer = false, mHardHammer = false, mSolderingTool = false, mCrowbar = false, mRunningOnLoad = false; - public int mPollution = 0, mProgresstime = 0, mMaxProgresstime = 0, mEUt = 0, mEfficiencyIncrease = 0, mUpdate = 0, mStartUpCheck = 100, mRuntime = 0, mEfficiency = 0; + public int mPollution = 0, mProgresstime = 0, mMaxProgresstime = 0, mEUt = 0, mEfficiencyIncrease = 0, mStartUpCheck = 100, mRuntime = 0, mEfficiency = 0; + public volatile int mUpdate = 0; public ItemStack[] mOutputItems = null; public FluidStack[] mOutputFluids = null; public String mNEI; diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PrimitiveBlastFurnace.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PrimitiveBlastFurnace.java index c0eb143f25..eeeef95dc3 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PrimitiveBlastFurnace.java +++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_PrimitiveBlastFurnace.java @@ -25,7 +25,7 @@ public abstract class GT_MetaTileEntity_PrimitiveBlastFurnace extends MetaTileEn public static final int INPUT_SLOTS = 3, OUTPUT_SLOTS = 3; public int mMaxProgresstime = 0; - public int mUpdate = 5; + public volatile int mUpdate = 5; public int mProgresstime = 0; public boolean mMachine = false; -- cgit From e41004e97876eecae1da518174698edcf1e5816f Mon Sep 17 00:00:00 2001 From: Technus Date: Fri, 17 Apr 2020 06:42:53 +0200 Subject: Shutdown properly --- .../threads/GT_Runnable_MachineBlockUpdate.java | 34 ++++++++++++++-------- 1 file changed, 22 insertions(+), 12 deletions(-) (limited to 'src/main/java/gregtech') diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java index 2ebe2dc5e3..c3c7cab6af 100644 --- a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java +++ b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java @@ -21,8 +21,8 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { private final Set visited = new HashSet<>(80); //Threading - private static final ThreadFactory THREAD_FACTORY= r -> { - Thread thread=new Thread(r); + private static final ThreadFactory THREAD_FACTORY = r -> { + Thread thread = new Thread(r); thread.setName("GT_MachineBlockUpdate"); return thread; }; @@ -40,24 +40,34 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { * If the thread is idle, sets new values and remove the idle flag, otherwise, queue the cooridinates. */ public static void setMachineUpdateValues(World aWorld, int aX, int aY, int aZ) { - EXECUTOR_SERVICE.submit(new GT_Runnable_MachineBlockUpdate(aWorld,aX,aY,aZ)); + EXECUTOR_SERVICE.submit(new GT_Runnable_MachineBlockUpdate(aWorld, aX, aY, aZ)); } public static void initExecutorService() { - EXECUTOR_SERVICE = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(),THREAD_FACTORY); + EXECUTOR_SERVICE = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), THREAD_FACTORY); //Executors.newSingleThreadExecutor(THREAD_FACTORY); //Executors.newCachedThreadPool(THREAD_FACTORY); //Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(),THREAD_FACTORY); } public static void shutdownExecutorService() { + EXECUTOR_SERVICE.shutdown(); // Disable new tasks from being submitted try { - EXECUTOR_SERVICE.awaitTermination(60, TimeUnit.SECONDS); - } catch (InterruptedException e) { - GT_Mod.GT_FML_LOGGER.error("Well this interruption got interrupted...", e); + // Wait a while for existing tasks to terminate + if (!EXECUTOR_SERVICE.awaitTermination(60, TimeUnit.SECONDS)) { + EXECUTOR_SERVICE.shutdownNow(); // Cancel currently executing tasks + // Wait a while for tasks to respond to being cancelled + if (!EXECUTOR_SERVICE.awaitTermination(60, TimeUnit.SECONDS)) { + GT_Mod.GT_FML_LOGGER.error("Well this didn't terminated well... GT_Runnable_MachineBlockUpdate.shutdownExecutorService"); + } + } + } catch (InterruptedException ie) { + GT_Mod.GT_FML_LOGGER.error("Well this interruption got interrupted...", ie); + // (Re-)Cancel if current thread also interrupted + EXECUTOR_SERVICE.shutdownNow(); + // Preserve interrupt status + Thread.currentThread().interrupt(); } - //terminates executor permanently - EXECUTOR_SERVICE.shutdownNow(); } private boolean shouldRecurse(TileEntity aTileEntity, int aX, int aY, int aZ) { @@ -70,7 +80,7 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { GregTech_API.isMachineBlock(world.getBlock(aX, aY, aZ), world.getBlockMetadata(aX, aY, aZ)); } - private void causeUpdate(TileEntity tileEntity){ + private void causeUpdate(TileEntity tileEntity) { //no check for IGregTechTileEntity as it should call the underlying meta tile onMachineBlockUpdate if (tileEntity instanceof IMachineBlockUpdateable) { ((IMachineBlockUpdateable) tileEntity).onMachineBlockUpdate(); @@ -99,7 +109,7 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { try { stepToUpdateMachine(x, y, z); } catch (Exception e) { - GT_Mod.GT_FML_LOGGER.error("Well this update was broken... " + new Coordinates(x,y,z,world), e); + GT_Mod.GT_FML_LOGGER.error("Well this update was broken... " + new Coordinates(x, y, z, world), e); } } @@ -122,7 +132,7 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { "mX=" + mX + ", mY=" + mY + ", mZ=" + mZ + - ", mWorld=" + mWorld.getProviderName()+ " @dimId " + mWorld.provider.dimensionId + + ", mWorld=" + mWorld.getProviderName() + " @dimId " + mWorld.provider.dimensionId + '}'; } } -- cgit From 180b2f6745958d9b71110f07be00a0f819c4504c Mon Sep 17 00:00:00 2001 From: Technus Date: Fri, 17 Apr 2020 06:51:13 +0200 Subject: Remove old comment --- .../java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'src/main/java/gregtech') diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java index c3c7cab6af..727faf29e2 100644 --- a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java +++ b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java @@ -35,10 +35,7 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { this.y = aY; this.z = aZ; } - - /** - * If the thread is idle, sets new values and remove the idle flag, otherwise, queue the cooridinates. - */ + public static void setMachineUpdateValues(World aWorld, int aX, int aY, int aZ) { EXECUTOR_SERVICE.submit(new GT_Runnable_MachineBlockUpdate(aWorld, aX, aY, aZ)); } -- cgit From 8fa74ef0035dadb21c4228b5366a7ea8684e598e Mon Sep 17 00:00:00 2001 From: Technus Date: Fri, 17 Apr 2020 07:00:11 +0200 Subject: Add more logging to shutdown --- .../java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src/main/java/gregtech') diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java index 727faf29e2..78596ec9ae 100644 --- a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java +++ b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java @@ -35,7 +35,7 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { this.y = aY; this.z = aZ; } - + public static void setMachineUpdateValues(World aWorld, int aX, int aY, int aZ) { EXECUTOR_SERVICE.submit(new GT_Runnable_MachineBlockUpdate(aWorld, aX, aY, aZ)); } @@ -48,8 +48,9 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { } public static void shutdownExecutorService() { - EXECUTOR_SERVICE.shutdown(); // Disable new tasks from being submitted try { + GT_Mod.GT_FML_LOGGER.info("Shutting down Machine block update executor service"); + EXECUTOR_SERVICE.shutdown(); // Disable new tasks from being submitted // Wait a while for existing tasks to terminate if (!EXECUTOR_SERVICE.awaitTermination(60, TimeUnit.SECONDS)) { EXECUTOR_SERVICE.shutdownNow(); // Cancel currently executing tasks @@ -64,6 +65,8 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { EXECUTOR_SERVICE.shutdownNow(); // Preserve interrupt status Thread.currentThread().interrupt(); + }finally { + GT_Mod.GT_FML_LOGGER.info("Leaving... GT_Runnable_MachineBlockUpdate.shutdownExecutorService"); } } -- cgit From 3287a00923693d0084bb60061c3211da832710fc Mon Sep 17 00:00:00 2001 From: Technus Date: Fri, 17 Apr 2020 07:02:33 +0200 Subject: Just in case? --- .../java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/main/java/gregtech') diff --git a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java index 78596ec9ae..3d28a94de9 100644 --- a/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java +++ b/src/main/java/gregtech/api/threads/GT_Runnable_MachineBlockUpdate.java @@ -65,6 +65,10 @@ public class GT_Runnable_MachineBlockUpdate implements Runnable { EXECUTOR_SERVICE.shutdownNow(); // Preserve interrupt status Thread.currentThread().interrupt(); + }catch (Exception e){ + GT_Mod.GT_FML_LOGGER.error("Well this didn't terminated well...",e); + // (Re-)Cancel in case + EXECUTOR_SERVICE.shutdownNow(); }finally { GT_Mod.GT_FML_LOGGER.info("Leaving... GT_Runnable_MachineBlockUpdate.shutdownExecutorService"); } -- cgit