mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
- Reverting r34697 for now, it breaks Developer Mode (functionality like Add Card To Hand, Add Card To Play, Setup Game State, etc.) and thus hinders proper debugging of the game in specific situations.
- Please feel free to revert this commit to continue working on the single thread executor project and then recommit once it no longer breaks dev mode.
This commit is contained in:
@@ -20,10 +20,8 @@ public class ThreadUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use a single game thread, rather than a pool of them, because when something
|
private final static ExecutorService gameThreadPool = Executors.newCachedThreadPool(new WorkerThreadFactory("Game"));
|
||||||
// needs to execute on the game thread, it's because it's not thread safe.
|
private static ExecutorService getGameThreadPool() { return gameThreadPool; }
|
||||||
private final static ExecutorService gameThread = Executors.newSingleThreadExecutor(new WorkerThreadFactory("Game"));
|
|
||||||
private static ExecutorService getGameThreadPool() { return gameThread; }
|
|
||||||
private final static ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(2, new WorkerThreadFactory("Delayed"));
|
private final static ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(2, new WorkerThreadFactory("Delayed"));
|
||||||
private static ScheduledExecutorService getScheduledPool() { return scheduledPool; }
|
private static ScheduledExecutorService getScheduledPool() { return scheduledPool; }
|
||||||
|
|
||||||
|
|||||||
@@ -298,7 +298,7 @@ public abstract class InputPayMana extends InputSyncronizedBase {
|
|||||||
// System.out.println("Chosen sa=" + chosen + " of " + chosen.getHostCard() + " to pay mana");
|
// System.out.println("Chosen sa=" + chosen + " of " + chosen.getHostCard() + " to pay mana");
|
||||||
|
|
||||||
locked = true;
|
locked = true;
|
||||||
runOnGameThread(game, new Runnable() {
|
game.getAction().invoke(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
HumanPlay.playSpellAbility(getController(), chosen.getActivatingPlayer(), chosen);
|
HumanPlay.playSpellAbility(getController(), chosen.getActivatingPlayer(), chosen);
|
||||||
@@ -390,7 +390,7 @@ public abstract class InputPayMana extends InputSyncronizedBase {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
//must run in game thread as certain payment actions can only be automated there
|
//must run in game thread as certain payment actions can only be automated there
|
||||||
runOnGameThread(game, new Runnable() {
|
game.getAction().invoke(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
runAsAi(proc);
|
runAsAi(proc);
|
||||||
|
|||||||
@@ -4,23 +4,14 @@ import java.util.concurrent.CountDownLatch;
|
|||||||
|
|
||||||
import forge.FThreads;
|
import forge.FThreads;
|
||||||
import forge.error.BugReporter;
|
import forge.error.BugReporter;
|
||||||
import forge.game.Game;
|
|
||||||
import forge.player.PlayerControllerHuman;
|
import forge.player.PlayerControllerHuman;
|
||||||
import forge.util.ThreadUtil;
|
|
||||||
|
|
||||||
public abstract class InputSyncronizedBase extends InputBase implements InputSynchronized {
|
public abstract class InputSyncronizedBase extends InputBase implements InputSynchronized {
|
||||||
private static final long serialVersionUID = 8756177361251703052L;
|
private static final long serialVersionUID = 8756177361251703052L;
|
||||||
private CountDownLatch cdlDone;
|
private final CountDownLatch cdlDone;
|
||||||
|
|
||||||
private boolean waitingOnGameThread;
|
|
||||||
private Runnable runnableToRun;
|
|
||||||
|
|
||||||
public InputSyncronizedBase(final PlayerControllerHuman controller) {
|
public InputSyncronizedBase(final PlayerControllerHuman controller) {
|
||||||
super(controller);
|
super(controller);
|
||||||
reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void reset() {
|
|
||||||
cdlDone = new CountDownLatch(1);
|
cdlDone = new CountDownLatch(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,30 +31,8 @@ public abstract class InputSyncronizedBase extends InputBase implements InputSyn
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void showAndWait() {
|
public void showAndWait() {
|
||||||
waitingOnGameThread = ThreadUtil.isGameThread();
|
|
||||||
|
|
||||||
getController().getInputQueue().setInput(this);
|
getController().getInputQueue().setInput(this);
|
||||||
awaitLatchRelease();
|
awaitLatchRelease();
|
||||||
|
|
||||||
while (runnableToRun != null) {
|
|
||||||
Runnable r = runnableToRun;
|
|
||||||
runnableToRun = null;
|
|
||||||
|
|
||||||
reset();
|
|
||||||
r.run();
|
|
||||||
|
|
||||||
awaitLatchRelease();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected final void runOnGameThread(Game game, Runnable r) {
|
|
||||||
if (waitingOnGameThread) {
|
|
||||||
runnableToRun = r;
|
|
||||||
cdlDone.countDown();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
game.getAction().invoke(r);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final void stop() {
|
protected final void stop() {
|
||||||
|
|||||||
Reference in New Issue
Block a user