From 37a0c9952d40fbbf3c16c526b462874f66e21786 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Fri, 22 Mar 2013 17:52:05 +0000 Subject: [PATCH] left a single stack of inputs in InputControl invokeInNewThread will now reset input the method has planted --- src/main/java/forge/FThreads.java | 19 +++++- src/main/java/forge/control/FControl.java | 4 -- .../forge/control/input/InputControl.java | 59 +++---------------- 3 files changed, 26 insertions(+), 56 deletions(-) diff --git a/src/main/java/forge/FThreads.java b/src/main/java/forge/FThreads.java index 16e77d3143a..f35a94923bd 100644 --- a/src/main/java/forge/FThreads.java +++ b/src/main/java/forge/FThreads.java @@ -14,6 +14,10 @@ import forge.control.input.InputLockUI; */ public class FThreads { + static { + System.out.printf("(FThreads static ctor): Running on a machine with %d cpu core(s)%n", Runtime.getRuntime().availableProcessors() ); + } + private final static ExecutorService threadPool = Executors.newCachedThreadPool(); public static ExecutorService getCachedPool() { return threadPool; @@ -84,11 +88,22 @@ public class FThreads { } private final static InputLockUI inpuptLock = new InputLockUI(); - public static void invokeInNewThread(Runnable proc, boolean lockUI) { - getCachedPool().execute(proc); + public static void invokeInNewThread(final Runnable proc, boolean lockUI) { + Runnable toRun = proc; if( lockUI ) { + // checkEDT("FThreads.invokeInNewthread", true) Singletons.getModel().getMatch().getInput().setInput(inpuptLock); + toRun = new Runnable() { + @Override + public void run() { + proc.run(); + // may try special unlock method here + Singletons.getModel().getMatch().getInput().resetInput(); + } + }; } + + getCachedPool().execute(toRun); } } diff --git a/src/main/java/forge/control/FControl.java b/src/main/java/forge/control/FControl.java index 270a82a9648..c6922f5cc6e 100644 --- a/src/main/java/forge/control/FControl.java +++ b/src/main/java/forge/control/FControl.java @@ -84,10 +84,6 @@ public enum FControl { private final SoundSystem soundSystem = new SoundSystem(); - - static { - System.out.printf("(FControl static ctor): Running on a machine with %d cpu core(s)%n", Runtime.getRuntime().availableProcessors() ); - } /** *

* FControl. diff --git a/src/main/java/forge/control/input/InputControl.java b/src/main/java/forge/control/input/InputControl.java index 2d45e142391..eda672e558f 100644 --- a/src/main/java/forge/control/input/InputControl.java +++ b/src/main/java/forge/control/input/InputControl.java @@ -40,10 +40,7 @@ public class InputControl extends MyObservable implements java.io.Serializable { /** Constant serialVersionUID=3955194449319994301L. */ private static final long serialVersionUID = 3955194449319994301L; - private Input input; - private final Stack inputStack = new Stack(); - private final Stack urgentInputStack = new Stack(); private final transient GameState game; /** @@ -65,13 +62,9 @@ public class InputControl extends MyObservable implements java.io.Serializable { * a {@link forge.control.input.Input} object. */ public final void setInput(final Input in) { - boolean isInputEmpty = this.input == null || this.input instanceof InputPassPriority; //System.out.println(in.getClass().getName()); - if (!this.game.getStack().isResolving() && isInputEmpty) { - this.input = in; - } else { - this.inputStack.add(in); - } + this.inputStack.push(in); + // System.out.print("Current: " + input + "; Stack = " + inputStack); this.updateObservers(); } @@ -87,21 +80,7 @@ public class InputControl extends MyObservable implements java.io.Serializable { */ public final void setInputInterrupt(final Input in) { // Make this - final Input old = this.input; - this.urgentInputStack.add(old); - this.changeInput(in); - } - - /** - *

- * changeInput. - *

- * - * @param in - * a {@link forge.control.input.Input} object. - */ - private void changeInput(final Input in) { - this.input = in; + this.inputStack.push(in); this.updateObservers(); } @@ -113,7 +92,7 @@ public class InputControl extends MyObservable implements java.io.Serializable { * @return a {@link forge.control.input.Input} object. */ public final Input getInput() { - return this.input; + return this.inputStack.peek(); } /** @@ -122,7 +101,6 @@ public class InputControl extends MyObservable implements java.io.Serializable { *

*/ public final void clearInput() { - this.input = null; this.inputStack.clear(); } @@ -136,7 +114,7 @@ public class InputControl extends MyObservable implements java.io.Serializable { * a boolean. */ public final void resetInput() { - this.input = null; + this.inputStack.pop(); this.updateObservers(); } @@ -157,30 +135,11 @@ public class InputControl extends MyObservable implements java.io.Serializable { final Player priority = handler.getPriorityPlayer(); final MagicStack stack = game.getStack(); + // TODO this resolving portion needs more work, but fixes Death Cloud // issues - if (this.urgentInputStack.size() > 0) { - if (this.input != null) { - return this.input; - } - - // if an SA is resolving, only change input for something that is - // part of the resolving SA - this.changeInput(this.urgentInputStack.pop()); - return this.input; - } - - if (stack.isResolving()) { - return null; - } - - if (this.input != null) { - return this.input; - } - if (!this.inputStack.isEmpty()) { // incoming input to Control - this.changeInput(this.inputStack.pop()); - return this.input; + return this.inputStack.peek(); } if (handler.hasPhaseEffects()) { @@ -249,8 +208,8 @@ public class InputControl extends MyObservable implements java.io.Serializable { PhaseHandler ph = game.getPhaseHandler(); final Input tmp = getActualInput(); - //String message = String.format("%s's %s, priority of %s [%sP] input is %s", ph.getPlayerTurn(), ph.getPhase(), ph.getPriorityPlayer(), ph.isPlayerPriorityAllowed() ? "+" : "-", tmp == null ? "null" : tmp.getClass().getSimpleName()); - //System.out.println(message); + String message = String.format("%s's %s, priority of %s [%sP] input is %s", ph.getPlayerTurn(), ph.getPhase(), ph.getPriorityPlayer(), ph.isPlayerPriorityAllowed() ? "+" : "-", tmp == null ? "null" : tmp.getClass().getSimpleName()); + System.out.println(message); if (tmp != null) { //System.out.println(ph.getPlayerTurn() + "'s " + ph.getPhase() + ", priority of " + ph.getPriorityPlayer() + " @ input is " + tmp.getClass().getName() ); CMessage.SINGLETON_INSTANCE.getInputControl().setInput(tmp);