From 8a167b47dc18588cb05b8c9e3fe6318ca4a98f3c Mon Sep 17 00:00:00 2001 From: Daniel Kirschten Date: Sun, 15 Sep 2019 21:35:33 +0200 Subject: [PATCH] MPM load no longer causes Timeline to crash --- .../logic/core/timeline/Timeline.java | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) 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 -- 2.17.1