From 010a3ae7271754ef22ac9ea789f6632afc1b4261 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Fri, 19 Apr 2013 06:41:27 +0000 Subject: [PATCH] fix for concurrent modification problems http://www.slightlymagic.net/forum/viewtopic.php?p=115820#p115820 note: copy to new arraylist does not help against comodification problem. The only known to me solution is use classes from java.util.concurrent Playarea redraw timeout increased to 50ms --- src/main/java/forge/FThreads.java | 9 +++++++++ .../java/forge/card/cardfactory/CardFactoryUtil.java | 2 +- src/main/java/forge/game/zone/Zone.java | 3 ++- src/main/java/forge/view/arcane/PlayArea.java | 10 ++-------- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/main/java/forge/FThreads.java b/src/main/java/forge/FThreads.java index a2dec8a4838..60cfb6e4f5d 100644 --- a/src/main/java/forge/FThreads.java +++ b/src/main/java/forge/FThreads.java @@ -135,6 +135,15 @@ public class FThreads { public static void delay(int milliseconds, Runnable inputUpdater) { getScheduledPool().schedule(inputUpdater, milliseconds, TimeUnit.MILLISECONDS); } + + public static void delayInEDT(int milliseconds, final Runnable inputUpdater) { + Runnable runInEdt = new Runnable() { + @Override public void run() { + FThreads.invokeInEdtNowOrLater(inputUpdater); + } + }; + delay(milliseconds, runInEdt); + } public static String debugGetCurrThreadId() { return isEDT() ? "EDT" : Long.toString(Thread.currentThread().getId()); diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index c1c5880fb19..f516ba9ef06 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -788,7 +788,7 @@ public class CardFactoryUtil { */ public static List getActivateablesFromZone(final PlayerZone zone, final Player activator) { - Iterable cl = Lists.newArrayList(zone.getCards()); + Iterable cl = zone.getCards(); // copy to new AL won't help here // Only check the top card of the library if (zone.is(ZoneType.Library)) { diff --git a/src/main/java/forge/game/zone/Zone.java b/src/main/java/forge/game/zone/Zone.java index 8f8d88b0735..1131f01b24d 100644 --- a/src/main/java/forge/game/zone/Zone.java +++ b/src/main/java/forge/game/zone/Zone.java @@ -23,6 +23,7 @@ import java.util.Iterator; import java.util.List; import java.util.Observable; import java.util.Observer; +import java.util.concurrent.CopyOnWriteArrayList; import forge.Card; import forge.Singletons; @@ -42,7 +43,7 @@ public class Zone extends MyObservable implements IZone, Observer, java.io.Seria private static final long serialVersionUID = -5687652485777639176L; /** The cards. */ - protected final transient List cardList = new ArrayList(); + protected final transient List cardList = new CopyOnWriteArrayList(); protected final transient List roCardList; protected final ZoneType zoneName; protected boolean update = true; diff --git a/src/main/java/forge/view/arcane/PlayArea.java b/src/main/java/forge/view/arcane/PlayArea.java index b81737924bc..0e88d75f9d0 100644 --- a/src/main/java/forge/view/arcane/PlayArea.java +++ b/src/main/java/forge/view/arcane/PlayArea.java @@ -503,17 +503,11 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen public void setupPlayZone() { boolean wasSet = wantRedraw.getAndSet(true); if(wasSet) return; - FThreads.invokeInEdtLater(new Runnable() { + FThreads.delayInEDT(50, new Runnable() { // postpone play area update per 50ms @Override public void run() { - try { // user won't notice, but the requests coming in that interval won't trigger re-draw - Thread.sleep(20); - } catch (InterruptedException e) { - e.printStackTrace(); - } wantRedraw.set(false); - final List modelshot = new ArrayList(model); // I am afraid of ConcurrentModificationExceptions - setupPlayZone(modelshot); + setupPlayZone(model); } }); }