X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.core%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fcore%2Ftimeline%2FTimeline.java;h=9dbc31d4d40d4c0573ca647eb23bfc1388c37223;hb=8bed58cd47f4e53a0a83e066d38864aa6875502f;hp=9c8659c689f19c789f1eadefa38ff94e387bbc40;hpb=9bb76ff610ab0fcc07a9049e4a572053339593c9;p=Mograsim.git 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