From d34e00bd0011a613a26721c35c3db556f1149d8c Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Fri, 8 Mar 2013 16:10:35 +0000 Subject: [PATCH] making isGameOver synchronized, isValid in InputProxy.java is also synchronized instead of being volatile --- .gitattributes | 1 + .../forge/game/GameInputUpdatesThread.java | 41 ++++++++++++++++++ src/main/java/forge/game/GameNew.java | 43 ------------------- src/main/java/forge/game/GameState.java | 4 +- src/main/java/forge/game/MatchController.java | 4 ++ src/main/java/forge/gui/InputProxy.java | 8 ++-- 6 files changed, 52 insertions(+), 49 deletions(-) create mode 100644 src/main/java/forge/game/GameInputUpdatesThread.java diff --git a/.gitattributes b/.gitattributes index 94a6f5830e9..8036e3a981a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -14145,6 +14145,7 @@ src/main/java/forge/game/GameActionPlay.java -text src/main/java/forge/game/GameActionUtil.java svneol=native#text/plain src/main/java/forge/game/GameEndReason.java -text src/main/java/forge/game/GameFormat.java -text +src/main/java/forge/game/GameInputUpdatesThread.java -text src/main/java/forge/game/GameLossReason.java -text src/main/java/forge/game/GameNew.java -text src/main/java/forge/game/GameOutcome.java -text diff --git a/src/main/java/forge/game/GameInputUpdatesThread.java b/src/main/java/forge/game/GameInputUpdatesThread.java new file mode 100644 index 00000000000..ae3fb61336e --- /dev/null +++ b/src/main/java/forge/game/GameInputUpdatesThread.java @@ -0,0 +1,41 @@ +package forge.game; + +import forge.error.BugReporter; +import forge.gui.match.controllers.CMessage; + +/** + * TODO: Write javadoc for this type. + * + */ +public final class GameInputUpdatesThread extends Thread { + private final MatchController match; + private final GameState game; + private boolean wasChangedRecently; + + /** + * TODO: Write javadoc for Constructor. + * @param match + * @param game + */ + public GameInputUpdatesThread(MatchController match, GameState game) { + this.match = match; + this.game = game; + } + + public void run(){ + while(!game.isGameOver()) { + boolean needsNewInput = CMessage.SINGLETON_INSTANCE.getInputControl().isValid() == false; + if ( needsNewInput ) { + match.getInput().setNewInput(game); + wasChangedRecently = true; + } + try { + Thread.sleep(wasChangedRecently ? 2 : 40); + wasChangedRecently = false; + } catch (InterruptedException e) { + BugReporter.reportException(e); + break; + } + } + } +} \ No newline at end of file diff --git a/src/main/java/forge/game/GameNew.java b/src/main/java/forge/game/GameNew.java index 165d5c34013..98c15656cbd 100644 --- a/src/main/java/forge/game/GameNew.java +++ b/src/main/java/forge/game/GameNew.java @@ -26,7 +26,6 @@ import forge.card.trigger.TriggerType; import forge.deck.Deck; import forge.deck.CardPool; import forge.deck.DeckSection; -import forge.error.BugReporter; import forge.game.event.FlipCoinEvent; import forge.game.phase.PhaseHandler; import forge.game.player.AIPlayer; @@ -34,7 +33,6 @@ import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; -import forge.gui.match.controllers.CMessage; import forge.gui.match.views.VAntes; import forge.item.CardPrinted; import forge.item.IPaperCard; @@ -49,43 +47,6 @@ import forge.util.MyRandom; */ public class GameNew { - /** - * TODO: Write javadoc for this type. - * - */ - public static final class GameInputUpdatesThread extends Thread { - private final MatchController match; - private final GameState game; - private boolean wasChangedRecently; - - /** - * TODO: Write javadoc for Constructor. - * @param match - * @param game - */ - public GameInputUpdatesThread(MatchController match, GameState game) { - this.match = match; - this.game = game; - } - - public void run(){ - while(!game.isGameOver()) { - boolean needsNewInput = CMessage.SINGLETON_INSTANCE.getInputControl().isValid() == false; - if ( needsNewInput ) { - match.getInput().setNewInput(game); - wasChangedRecently = true; - } - try { - Thread.sleep(wasChangedRecently ? 2 : 40); - wasChangedRecently = false; - } catch (InterruptedException e) { - BugReporter.reportException(e); - break; - } - } - } - } - public static final ForgePreferences preferences = Singletons.getModel().getPreferences(); private static void preparePlayerLibrary(Player player, final ZoneType zoneType, CardPool secion, boolean canRandomFoil, Random generator) { @@ -235,10 +196,6 @@ public class GameNew { for (final Player p1 : game.getPlayers()) { p1.drawCards(p1.getMaxHandSize()); } - - Thread thGame = new GameInputUpdatesThread(match, game); - thGame.setName("Game input updater"); - thGame.start(); } // ultimate of Karn the Liberated diff --git a/src/main/java/forge/game/GameState.java b/src/main/java/forge/game/GameState.java index 88a1c9903f5..1cf4df89fff 100644 --- a/src/main/java/forge/game/GameState.java +++ b/src/main/java/forge/game/GameState.java @@ -287,7 +287,7 @@ public class GameState { /** * @return the gameOver */ - public boolean isGameOver() { + public synchronized boolean isGameOver() { return gameOver; } @@ -295,7 +295,7 @@ public class GameState { * @param reason * @param go the gameOver to set */ - public void setGameOver(GameEndReason reason) { + public synchronized void setGameOver(GameEndReason reason) { this.gameOver = true; for (Player p : roIngamePlayers) { p.onGameOver(); diff --git a/src/main/java/forge/game/MatchController.java b/src/main/java/forge/game/MatchController.java index 4f0e9455979..ea051d1e83d 100644 --- a/src/main/java/forge/game/MatchController.java +++ b/src/main/java/forge/game/MatchController.java @@ -160,6 +160,10 @@ public class MatchController { final boolean canRandomFoil = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_RANDOM_FOIL) && gameType == GameType.Constructed; GameNew.newGame(this, startConditions, currentGame, canRandomFoil); + Thread thGame = new GameInputUpdatesThread(this, currentGame); + thGame.setName("Game input updater"); + thGame.start(); + // TODO restore this functionality!!! //VMatchUI.SINGLETON_INSTANCE.getViewDevMode().getDocument().setVisible(Preferences.DEV_MODE); for (final VField field : VMatchUI.SINGLETON_INSTANCE.getFieldViews()) { diff --git a/src/main/java/forge/gui/InputProxy.java b/src/main/java/forge/gui/InputProxy.java index 8219cd50199..0d33017066e 100644 --- a/src/main/java/forge/gui/InputProxy.java +++ b/src/main/java/forge/gui/InputProxy.java @@ -38,10 +38,10 @@ public class InputProxy extends MyObservable implements Observer { /** The input. */ private Input input; - private volatile boolean valid = false; + private boolean valid = false; @Override - public final void update(final Observable observable, final Object obj) { + public final synchronized void update(final Observable observable, final Object obj) { valid = false; } /** @@ -52,7 +52,7 @@ public class InputProxy extends MyObservable implements Observer { * @param in * a {@link forge.control.input.Input} object. */ - public final void setInput(final Input in) { + public final synchronized void setInput(final Input in) { valid = true; this.input = in; this.input.showMessage(); // this call may invalidate the input by the time it returns @@ -114,7 +114,7 @@ public class InputProxy extends MyObservable implements Observer { } - public boolean isValid() { + public synchronized boolean isValid() { return valid; } }