diff --git a/src/engine/job/AbstractJob.java b/src/engine/job/AbstractJob.java index 3d2ed162..0e61c94d 100644 --- a/src/engine/job/AbstractJob.java +++ b/src/engine/job/AbstractJob.java @@ -68,7 +68,7 @@ public abstract class AbstractJob implements Runnable { this.markStopRunTime(); } - protected abstract void doJob(); + public abstract void doJob(); public void executeJob(String threadName) { this.workerID.set(threadName); diff --git a/src/engine/job/AbstractScheduleJob.java b/src/engine/job/AbstractScheduleJob.java index 3ba8a494..daea2fcc 100644 --- a/src/engine/job/AbstractScheduleJob.java +++ b/src/engine/job/AbstractScheduleJob.java @@ -17,7 +17,7 @@ public abstract class AbstractScheduleJob extends AbstractJob { } @Override - protected abstract void doJob(); + public abstract void doJob(); public void cancelJob() { JobScheduler.getInstance().cancelScheduledJob(this); diff --git a/src/engine/job/JobContainer.java b/src/engine/job/JobContainer.java index 181e85cd..709c69e6 100644 --- a/src/engine/job/JobContainer.java +++ b/src/engine/job/JobContainer.java @@ -16,7 +16,7 @@ public class JobContainer implements Comparable { final long timeOfExecution; final boolean noTimer; - JobContainer(AbstractJob job, long timeOfExecution) { + public JobContainer(AbstractJob job, long timeOfExecution) { if (job == null) { throw new IllegalArgumentException("No 'null' jobs allowed."); } diff --git a/src/engine/job/JobThread.java b/src/engine/job/JobThread.java new file mode 100644 index 00000000..232dfa7c --- /dev/null +++ b/src/engine/job/JobThread.java @@ -0,0 +1,40 @@ +package engine.job; + +import org.pmw.tinylog.Logger; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantLock; + +public class JobThread implements Runnable { + private final AbstractJob currentJob; + private final ReentrantLock lock = new ReentrantLock(); + + public JobThread(AbstractJob job){ + this.currentJob = job; + } + + @Override + public void run() { + try { + if (this.currentJob != null) { + if (lock.tryLock(5, TimeUnit.SECONDS)) { // Timeout to prevent deadlock + try { + this.currentJob.doJob(); + } finally { + lock.unlock(); + } + } else { + Logger.warn("JobThread could not acquire lock in time, skipping job."); + } + } + } catch (Exception e) { + Logger.error(e); + } + } + + public static void startJobThread(AbstractJob job){ + JobThread jobThread = new JobThread(job); + Thread thread = new Thread(jobThread); + thread.start(); + } +} diff --git a/src/engine/job/JobWorker.java b/src/engine/job/JobWorker.java index f333802b..80cd610b 100644 --- a/src/engine/job/JobWorker.java +++ b/src/engine/job/JobWorker.java @@ -58,8 +58,11 @@ public class JobWorker extends ControlledRunnable { } else { // execute the new job.. - this.currentJob.executeJob(this.getThreadName()); - this.currentJob = null; + //this.currentJob.executeJob(this.getThreadName()); + if(this.currentJob != null) { + JobThread.startJobThread(this.currentJob); + this.currentJob = null; + } } Thread.yield(); } diff --git a/src/engine/jobs/AbstractEffectJob.java b/src/engine/jobs/AbstractEffectJob.java index 3eb26592..3ce87436 100644 --- a/src/engine/jobs/AbstractEffectJob.java +++ b/src/engine/jobs/AbstractEffectJob.java @@ -45,7 +45,7 @@ public abstract class AbstractEffectJob extends AbstractScheduleJob { } @Override - protected abstract void doJob(); + public abstract void doJob(); @Override protected abstract void _cancelJob(); diff --git a/src/engine/jobs/ActivateBaneJob.java b/src/engine/jobs/ActivateBaneJob.java index 65d3cd94..da4e0a37 100644 --- a/src/engine/jobs/ActivateBaneJob.java +++ b/src/engine/jobs/ActivateBaneJob.java @@ -29,7 +29,7 @@ public class ActivateBaneJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { City city; diff --git a/src/engine/jobs/AttackJob.java b/src/engine/jobs/AttackJob.java index affed880..02c3d5f0 100644 --- a/src/engine/jobs/AttackJob.java +++ b/src/engine/jobs/AttackJob.java @@ -27,7 +27,7 @@ public class AttackJob extends AbstractJob { } @Override - protected void doJob() { + public void doJob() { CombatManager.doCombat(this.source, slot); } diff --git a/src/engine/jobs/BaneDefaultTimeJob.java b/src/engine/jobs/BaneDefaultTimeJob.java index 54f8e162..9f0c46e1 100644 --- a/src/engine/jobs/BaneDefaultTimeJob.java +++ b/src/engine/jobs/BaneDefaultTimeJob.java @@ -24,7 +24,7 @@ public class BaneDefaultTimeJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { //bane already set. if (this.bane.getLiveDate() != null) { diff --git a/src/engine/jobs/BasicScheduledJob.java b/src/engine/jobs/BasicScheduledJob.java index 5c29fe7f..f5dc0fe9 100644 --- a/src/engine/jobs/BasicScheduledJob.java +++ b/src/engine/jobs/BasicScheduledJob.java @@ -97,7 +97,7 @@ public class BasicScheduledJob extends AbstractJob { } @Override - protected void doJob() { + public void doJob() { if (execution == null) { Logger.error("BasicScheduledJob executed with nothing to execute."); return; diff --git a/src/engine/jobs/BonusCalcJob.java b/src/engine/jobs/BonusCalcJob.java index 0aa3e514..bb0ed990 100644 --- a/src/engine/jobs/BonusCalcJob.java +++ b/src/engine/jobs/BonusCalcJob.java @@ -22,7 +22,7 @@ public class BonusCalcJob extends AbstractJob { } @Override - protected void doJob() { + public void doJob() { if (this.ac != null) { this.ac.applyBonuses(); diff --git a/src/engine/jobs/CSessionCleanupJob.java b/src/engine/jobs/CSessionCleanupJob.java index 38002471..2836493e 100644 --- a/src/engine/jobs/CSessionCleanupJob.java +++ b/src/engine/jobs/CSessionCleanupJob.java @@ -22,7 +22,7 @@ public class CSessionCleanupJob extends AbstractJob { } @Override - protected void doJob() { + public void doJob() { SessionManager.cSessionCleanup(secKey); } } diff --git a/src/engine/jobs/ChangeAltitudeJob.java b/src/engine/jobs/ChangeAltitudeJob.java index 72a1cd8c..137843fd 100644 --- a/src/engine/jobs/ChangeAltitudeJob.java +++ b/src/engine/jobs/ChangeAltitudeJob.java @@ -27,7 +27,7 @@ public class ChangeAltitudeJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { if (this.ac != null) MovementManager.finishChangeAltitude(ac, targetAlt); } diff --git a/src/engine/jobs/ChantJob.java b/src/engine/jobs/ChantJob.java index cfb2bfb7..d604a8cd 100644 --- a/src/engine/jobs/ChantJob.java +++ b/src/engine/jobs/ChantJob.java @@ -36,7 +36,7 @@ public class ChantJob extends AbstractEffectJob { } @Override - protected void doJob() { + public void doJob() { if (this.aej == null || this.source == null || this.target == null || this.action == null || this.power == null || this.source == null || this.eb == null) return; PlayerBonuses bonuses = null; diff --git a/src/engine/jobs/CloseGateJob.java b/src/engine/jobs/CloseGateJob.java index 46168b76..2ee84454 100644 --- a/src/engine/jobs/CloseGateJob.java +++ b/src/engine/jobs/CloseGateJob.java @@ -29,7 +29,7 @@ public class CloseGateJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { if (building == null) { Logger.error("Rungate building was null"); diff --git a/src/engine/jobs/DamageOverTimeJob.java b/src/engine/jobs/DamageOverTimeJob.java index 56a9e34e..302f0c6d 100644 --- a/src/engine/jobs/DamageOverTimeJob.java +++ b/src/engine/jobs/DamageOverTimeJob.java @@ -37,7 +37,7 @@ public class DamageOverTimeJob extends AbstractEffectJob { } @Override - protected void doJob() { + public void doJob() { if (this.target.getObjectType().equals(GameObjectType.Building) && ((Building) this.target).isVulnerable() == false) { _cancelJob(); diff --git a/src/engine/jobs/DatabaseUpdateJob.java b/src/engine/jobs/DatabaseUpdateJob.java index fa45cf44..d4bb5788 100644 --- a/src/engine/jobs/DatabaseUpdateJob.java +++ b/src/engine/jobs/DatabaseUpdateJob.java @@ -28,7 +28,7 @@ public class DatabaseUpdateJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { if (this.ago == null) return; ago.removeDatabaseJob(this.type, false); diff --git a/src/engine/jobs/DebugTimerJob.java b/src/engine/jobs/DebugTimerJob.java index 17f7ec04..fb6139c0 100644 --- a/src/engine/jobs/DebugTimerJob.java +++ b/src/engine/jobs/DebugTimerJob.java @@ -29,7 +29,7 @@ public class DebugTimerJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { if (this.pc == null) { return; } diff --git a/src/engine/jobs/DeferredPowerJob.java b/src/engine/jobs/DeferredPowerJob.java index 6cd6973f..c3113ec1 100644 --- a/src/engine/jobs/DeferredPowerJob.java +++ b/src/engine/jobs/DeferredPowerJob.java @@ -37,7 +37,7 @@ public class DeferredPowerJob extends AbstractEffectJob { } @Override - protected void doJob() { + public void doJob() { //Power ended with no attack, cancel weapon power boost if (this.source != null && this.source instanceof PlayerCharacter) { ((PlayerCharacter) this.source).setWeaponPower(null); diff --git a/src/engine/jobs/DisconnectJob.java b/src/engine/jobs/DisconnectJob.java index f78448cc..32fc19b0 100644 --- a/src/engine/jobs/DisconnectJob.java +++ b/src/engine/jobs/DisconnectJob.java @@ -22,7 +22,7 @@ public class DisconnectJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { if (this.origin != null) { this.origin.disconnect(); } diff --git a/src/engine/jobs/DoorCloseJob.java b/src/engine/jobs/DoorCloseJob.java index 8606d6f3..71d304fc 100644 --- a/src/engine/jobs/DoorCloseJob.java +++ b/src/engine/jobs/DoorCloseJob.java @@ -28,7 +28,7 @@ public class DoorCloseJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { int doorNumber; diff --git a/src/engine/jobs/EndFearJob.java b/src/engine/jobs/EndFearJob.java index fef762d5..fd9079ec 100644 --- a/src/engine/jobs/EndFearJob.java +++ b/src/engine/jobs/EndFearJob.java @@ -22,7 +22,7 @@ public class EndFearJob extends AbstractEffectJob { } @Override - protected void doJob() { + public void doJob() { //cancel fear for mob. diff --git a/src/engine/jobs/FinishCooldownTimeJob.java b/src/engine/jobs/FinishCooldownTimeJob.java index 6759cf87..9ec7ae0e 100644 --- a/src/engine/jobs/FinishCooldownTimeJob.java +++ b/src/engine/jobs/FinishCooldownTimeJob.java @@ -26,7 +26,7 @@ public class FinishCooldownTimeJob extends AbstractJob { } @Override - protected void doJob() { + public void doJob() { PowersManager.finishCooldownTime(this.msg, this.pc); } } diff --git a/src/engine/jobs/FinishEffectTimeJob.java b/src/engine/jobs/FinishEffectTimeJob.java index 60786f68..d4c5d7a8 100644 --- a/src/engine/jobs/FinishEffectTimeJob.java +++ b/src/engine/jobs/FinishEffectTimeJob.java @@ -22,7 +22,7 @@ public class FinishEffectTimeJob extends AbstractEffectJob { } @Override - protected void doJob() { + public void doJob() { PowersManager.finishEffectTime(this.source, this.target, this.action, this.trains); } diff --git a/src/engine/jobs/FinishRecycleTimeJob.java b/src/engine/jobs/FinishRecycleTimeJob.java index 47c4126a..010601ac 100644 --- a/src/engine/jobs/FinishRecycleTimeJob.java +++ b/src/engine/jobs/FinishRecycleTimeJob.java @@ -26,7 +26,7 @@ public class FinishRecycleTimeJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { PowersManager.finishRecycleTime(this.msg, this.pc, false); } diff --git a/src/engine/jobs/FinishSpireEffectJob.java b/src/engine/jobs/FinishSpireEffectJob.java index d4b895e1..74e3afc5 100644 --- a/src/engine/jobs/FinishSpireEffectJob.java +++ b/src/engine/jobs/FinishSpireEffectJob.java @@ -20,7 +20,7 @@ public class FinishSpireEffectJob extends AbstractEffectJob { } @Override - protected void doJob() { + public void doJob() { PlayerCharacter pc = (PlayerCharacter) target; diff --git a/src/engine/jobs/FinishSummonsJob.java b/src/engine/jobs/FinishSummonsJob.java index 77fb3de3..38f63e91 100644 --- a/src/engine/jobs/FinishSummonsJob.java +++ b/src/engine/jobs/FinishSummonsJob.java @@ -31,7 +31,7 @@ public class FinishSummonsJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { if (this.target == null) return; diff --git a/src/engine/jobs/LoadEffectsJob.java b/src/engine/jobs/LoadEffectsJob.java index 4ad1ecb8..1efad9f3 100644 --- a/src/engine/jobs/LoadEffectsJob.java +++ b/src/engine/jobs/LoadEffectsJob.java @@ -28,7 +28,7 @@ public class LoadEffectsJob extends AbstractJob { } @Override - protected void doJob() { + public void doJob() { if (this.originToSend == null) { return; } diff --git a/src/engine/jobs/LogoutCharacterJob.java b/src/engine/jobs/LogoutCharacterJob.java index 3be22f07..7dba5297 100644 --- a/src/engine/jobs/LogoutCharacterJob.java +++ b/src/engine/jobs/LogoutCharacterJob.java @@ -25,7 +25,7 @@ public class LogoutCharacterJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { server.logoutCharacter(this.pc); } diff --git a/src/engine/jobs/NoTimeJob.java b/src/engine/jobs/NoTimeJob.java index 309bec03..b51122cc 100644 --- a/src/engine/jobs/NoTimeJob.java +++ b/src/engine/jobs/NoTimeJob.java @@ -19,7 +19,7 @@ public class NoTimeJob extends AbstractEffectJob { } @Override - protected void doJob() { + public void doJob() { } @Override diff --git a/src/engine/jobs/PersistentAoeJob.java b/src/engine/jobs/PersistentAoeJob.java index 68465274..efd19b8f 100644 --- a/src/engine/jobs/PersistentAoeJob.java +++ b/src/engine/jobs/PersistentAoeJob.java @@ -40,7 +40,7 @@ public class PersistentAoeJob extends AbstractEffectJob { } @Override - protected void doJob() { + public void doJob() { if (this.aej == null || this.source == null || this.action == null || this.power == null || this.source == null || this.eb == null) return; diff --git a/src/engine/jobs/RefreshGroupJob.java b/src/engine/jobs/RefreshGroupJob.java index fcc7c9c9..4496cdb9 100644 --- a/src/engine/jobs/RefreshGroupJob.java +++ b/src/engine/jobs/RefreshGroupJob.java @@ -45,7 +45,7 @@ public class RefreshGroupJob extends AbstractJob { } @Override - protected void doJob() { + public void doJob() { if (this.pc == null || this.origin == null || grp == null) { return; diff --git a/src/engine/jobs/RemoveCorpseJob.java b/src/engine/jobs/RemoveCorpseJob.java index 78bf73bd..852916f4 100644 --- a/src/engine/jobs/RemoveCorpseJob.java +++ b/src/engine/jobs/RemoveCorpseJob.java @@ -22,7 +22,7 @@ public class RemoveCorpseJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { if (this.corpse != null) Corpse.removeCorpse(corpse, true); diff --git a/src/engine/jobs/SiegeSpireWithdrawlJob.java b/src/engine/jobs/SiegeSpireWithdrawlJob.java index dbd270af..b1360199 100644 --- a/src/engine/jobs/SiegeSpireWithdrawlJob.java +++ b/src/engine/jobs/SiegeSpireWithdrawlJob.java @@ -25,7 +25,7 @@ public class SiegeSpireWithdrawlJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { if (spire == null) return; diff --git a/src/engine/jobs/StuckJob.java b/src/engine/jobs/StuckJob.java index 79d5541c..1befa71e 100644 --- a/src/engine/jobs/StuckJob.java +++ b/src/engine/jobs/StuckJob.java @@ -30,7 +30,7 @@ public class StuckJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { Vector3fImmutable stuckLoc; Building building = null; diff --git a/src/engine/jobs/SummonSendJob.java b/src/engine/jobs/SummonSendJob.java index 0e5951a4..2f79950f 100644 --- a/src/engine/jobs/SummonSendJob.java +++ b/src/engine/jobs/SummonSendJob.java @@ -27,7 +27,7 @@ public class SummonSendJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { if (this.source == null) return; diff --git a/src/engine/jobs/TeleportJob.java b/src/engine/jobs/TeleportJob.java index 0bb94f8e..406c5d1a 100644 --- a/src/engine/jobs/TeleportJob.java +++ b/src/engine/jobs/TeleportJob.java @@ -39,7 +39,7 @@ public class TeleportJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { if (this.pc == null || this.npc == null || this.origin == null) return; diff --git a/src/engine/jobs/TrackJob.java b/src/engine/jobs/TrackJob.java index 066292b4..5984f1bf 100644 --- a/src/engine/jobs/TrackJob.java +++ b/src/engine/jobs/TrackJob.java @@ -35,7 +35,7 @@ public class TrackJob extends AbstractEffectJob { } @Override - protected void doJob() { + public void doJob() { if (this.tpa == null || this.target == null || this.action == null || this.source == null || this.eb == null || !(this.source instanceof PlayerCharacter)) return; diff --git a/src/engine/jobs/TransferStatOTJob.java b/src/engine/jobs/TransferStatOTJob.java index e4fa31ac..569282b6 100644 --- a/src/engine/jobs/TransferStatOTJob.java +++ b/src/engine/jobs/TransferStatOTJob.java @@ -29,7 +29,7 @@ public class TransferStatOTJob extends AbstractEffectJob { } @Override - protected void doJob() { + public void doJob() { if (this.dot == null || this.target == null || this.action == null || this.source == null || this.eb == null || this.action == null || this.power == null) return; if (!this.target.isAlive()) { diff --git a/src/engine/jobs/UpdateGroupJob.java b/src/engine/jobs/UpdateGroupJob.java index 5d31f0a3..9b8fc050 100644 --- a/src/engine/jobs/UpdateGroupJob.java +++ b/src/engine/jobs/UpdateGroupJob.java @@ -26,7 +26,7 @@ public class UpdateGroupJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { if (this.group == null) return; diff --git a/src/engine/jobs/UpgradeBuildingJob.java b/src/engine/jobs/UpgradeBuildingJob.java index ac03a21c..84667cd3 100644 --- a/src/engine/jobs/UpgradeBuildingJob.java +++ b/src/engine/jobs/UpgradeBuildingJob.java @@ -22,7 +22,7 @@ public class UpgradeBuildingJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { // Must have a building to rank! diff --git a/src/engine/jobs/UpgradeNPCJob.java b/src/engine/jobs/UpgradeNPCJob.java index d080746c..6aadd03b 100644 --- a/src/engine/jobs/UpgradeNPCJob.java +++ b/src/engine/jobs/UpgradeNPCJob.java @@ -27,7 +27,7 @@ public class UpgradeNPCJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { int newRank; diff --git a/src/engine/jobs/UseItemJob.java b/src/engine/jobs/UseItemJob.java index 008e74a7..575512c5 100644 --- a/src/engine/jobs/UseItemJob.java +++ b/src/engine/jobs/UseItemJob.java @@ -34,7 +34,7 @@ public class UseItemJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { PowersManager.finishApplyPower(ac, target, Vector3fImmutable.ZERO, pb, trains, liveCounter); } diff --git a/src/engine/jobs/UseMobPowerJob.java b/src/engine/jobs/UseMobPowerJob.java index 3b827a34..29217c00 100644 --- a/src/engine/jobs/UseMobPowerJob.java +++ b/src/engine/jobs/UseMobPowerJob.java @@ -35,7 +35,7 @@ public class UseMobPowerJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { PowersManager.finishUseMobPower(this.msg, this.caster, casterLiveCounter, targetLiveCounter); } diff --git a/src/engine/jobs/UsePowerJob.java b/src/engine/jobs/UsePowerJob.java index c9d4c18f..87600c5b 100644 --- a/src/engine/jobs/UsePowerJob.java +++ b/src/engine/jobs/UsePowerJob.java @@ -35,7 +35,7 @@ public class UsePowerJob extends AbstractScheduleJob { } @Override - protected void doJob() { + public void doJob() { PowersManager.finishUsePower(this.msg, this.pc, casterLiveCounter, targetLiveCounter); } diff --git a/src/engine/net/AbstractConnectionManager.java b/src/engine/net/AbstractConnectionManager.java index a3392c40..a442e129 100644 --- a/src/engine/net/AbstractConnectionManager.java +++ b/src/engine/net/AbstractConnectionManager.java @@ -665,7 +665,7 @@ public abstract class AbstractConnectionManager extends ControlledRunnable { } @Override - protected void doJob() { + public void doJob() { if (runStatus) { this.ac.connMan.receive(sk); this.ac.execTask.compareAndSet(true, false); @@ -694,7 +694,7 @@ public abstract class AbstractConnectionManager extends ControlledRunnable { } @Override - protected void doJob() { + public void doJob() { if (runStatus) { this.ac.connMan.sendFinish(sk); this.ac.execTask.compareAndSet(true, false); diff --git a/src/engine/net/CheckNetMsgFactoryJob.java b/src/engine/net/CheckNetMsgFactoryJob.java index 5f93b596..879cf15e 100644 --- a/src/engine/net/CheckNetMsgFactoryJob.java +++ b/src/engine/net/CheckNetMsgFactoryJob.java @@ -23,7 +23,7 @@ public class CheckNetMsgFactoryJob extends AbstractJob { } @Override - protected void doJob() { + public void doJob() { NetMsgFactory factory = conn.getFactory(); // Make any/all msg possible diff --git a/src/engine/net/ConnectionMonitorJob.java b/src/engine/net/ConnectionMonitorJob.java index 06668bc6..bd87fbad 100644 --- a/src/engine/net/ConnectionMonitorJob.java +++ b/src/engine/net/ConnectionMonitorJob.java @@ -26,7 +26,7 @@ public class ConnectionMonitorJob extends AbstractJob { } @Override - protected void doJob() { + public void doJob() { if (this.cnt >= 5) { this.connMan.auditSocketChannelToConnectionMap();