From: Daniel Kirschten Date: Sun, 15 Sep 2019 19:35:33 +0000 (+0200) Subject: MPM load no longer causes Timeline to crash X-Git-Url: https://mograsim.net/gitweb/?a=commitdiff_plain;h=8a167b47dc18588cb05b8c9e3fe6318ca4a98f3c;p=Mograsim.git MPM load no longer causes Timeline to crash --- diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java index 9c8659c6..9dbc31d4 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java @@ -94,17 +94,19 @@ public class Timeline return ExecutionResult.NOTHING_DONE; } int checkStop = 0; - InnerEvent first = events.peek(); while (hasNext() && !condition.getAsBoolean()) { - events.remove(); - lastTimeUpdated = first.getTiming(); - first.run(); + InnerEvent event; + synchronized (events) + { + event = events.remove(); + } + lastTimeUpdated = event.getTiming(); + event.run(); // Don't check after every run checkStop = (checkStop + 1) % 10; if (checkStop == 0 && System.currentTimeMillis() >= stopMillis) return ExecutionResult.EXEC_OUT_OF_TIME; - first = events.peek(); } lastTimeUpdated = getSimulationTime(); return hasNext() ? ExecutionResult.EXEC_UNTIL_EMPTY : ExecutionResult.EXEC_UNTIL_CONDITION; @@ -147,7 +149,10 @@ public class Timeline */ public void reset() { - events.clear(); + synchronized (events) + { + events.clear(); + } lastTimeUpdated = 0; } @@ -177,7 +182,10 @@ public class Timeline { long timing = getSimulationTime() + relativeTiming; TimelineEvent event = new TimelineEvent(timing); - events.add(new InnerEvent(function, event, eventCounter++)); + synchronized (events) + { + events.add(new InnerEvent(function, event, eventCounter++)); + } eventAddedListener.forEach(l -> l.accept(event)); } @@ -233,7 +241,12 @@ public class Timeline @Override public String toString() { - return String.format("Simulation time: %s, Last update: %d, Events: %s", getSimulationTime(), lastTimeUpdated, events.toString()); + String eventsString; + synchronized (events) + { + eventsString = events.toString(); + } + return String.format("Simulation time: %s, Last update: %d, Events: %s", getSimulationTime(), lastTimeUpdated, eventsString); } public enum ExecutionResult