diff options
| -rw-r--r-- | sources/core/VSTask.java | 23 | ||||
| -rw-r--r-- | sources/events/VSAbstractEvent.java | 14 | ||||
| -rw-r--r-- | sources/events/implementations/VSProcessCrashEvent.java | 4 | ||||
| -rw-r--r-- | sources/events/implementations/VSProcessRecoverEvent.java | 4 | ||||
| -rw-r--r-- | sources/events/internal/VSMessageReceiveEvent.java | 32 | ||||
| -rw-r--r-- | sources/events/internal/VSProtocolEvent.java | 4 | ||||
| -rw-r--r-- | sources/events/internal/VSProtocolScheduleEvent.java | 4 | ||||
| -rw-r--r-- | sources/protocols/VSAbstractProtocol.java | 8 | ||||
| -rw-r--r-- | sources/simulator/VSSimulatorCanvas.java | 41 |
9 files changed, 71 insertions, 63 deletions
diff --git a/sources/core/VSTask.java b/sources/core/VSTask.java index 85e7dd6..5039612 100644 --- a/sources/core/VSTask.java +++ b/sources/core/VSTask.java @@ -64,12 +64,6 @@ public class VSTask implements Comparable { /** The simulation's default prefs. */ private VSPrefs prefs; - /** The message line, which gets drawn by the simulation canvas. this - * reference is needed here in order to remove the message line from - * the painting area if the message is not relevant - */ - private simulator.VSSimulatorCanvas.VSMessageLine messageLine; - /** The task is programmed. The task will be still in the task manager * after reset. */ @@ -214,28 +208,13 @@ public class VSTask implements Comparable { } /** - * Sets the message line. - * - * @param messageLine the message line - */ - public void setMessageLine(simulator.VSSimulatorCanvas.VSMessageLine - messageLine) { - this.messageLine = messageLine; - } - - /** * Runs the task. */ public void run() { if (event.getProcess() == null) event.init(process); - if (messageLine != null) { - if (!event.onStart()) - process.getSimulatorCanvas().removeMessageLine(messageLine); - } else { - event.onStart(); - } + event.onStart(); } /** diff --git a/sources/events/VSAbstractEvent.java b/sources/events/VSAbstractEvent.java index 146c428..15b742f 100644 --- a/sources/events/VSAbstractEvent.java +++ b/sources/events/VSAbstractEvent.java @@ -55,10 +55,11 @@ abstract public class VSAbstractEvent extends VSPrefs { * @param process the process */ public void init(VSProcess process) { - this.process = process; - this.prefs = process.getPrefs(); - - init(); + if (this.process == null) { + this.process = process; + this.prefs = process.getPrefs(); + init(); + } } /** @@ -157,9 +158,6 @@ abstract public class VSAbstractEvent extends VSPrefs { /** * Every event can get started. This method get's executed if the event * takes place. - * - * @return false, if a message has been delivered but is not relevant and - * can get removed from the simulator canvas paint area. true otherwise. */ - abstract public boolean onStart(); + abstract public void onStart(); } diff --git a/sources/events/implementations/VSProcessCrashEvent.java b/sources/events/implementations/VSProcessCrashEvent.java index 4a49942..c281500 100644 --- a/sources/events/implementations/VSProcessCrashEvent.java +++ b/sources/events/implementations/VSProcessCrashEvent.java @@ -44,12 +44,10 @@ public class VSProcessCrashEvent extends VSAbstractEvent { /* (non-Javadoc) * @see events.VSAbstractEvent#onStart() */ - public boolean onStart() { + public void onStart() { if (!process.isCrashed()) { process.isCrashed(true); logg(prefs.getString("lang.crashed")); } - - return true; } } diff --git a/sources/events/implementations/VSProcessRecoverEvent.java b/sources/events/implementations/VSProcessRecoverEvent.java index 0c0ddb9..43479cf 100644 --- a/sources/events/implementations/VSProcessRecoverEvent.java +++ b/sources/events/implementations/VSProcessRecoverEvent.java @@ -45,12 +45,10 @@ public class VSProcessRecoverEvent extends VSAbstractEvent { /* (non-Javadoc) * @see events.VSAbstractEvent#onStart() */ - public boolean onStart() { + public void onStart() { if (process.isCrashed()) { process.isCrashed(false); logg(prefs.getString("lang.recovered")); } - - return true; } } diff --git a/sources/events/internal/VSMessageReceiveEvent.java b/sources/events/internal/VSMessageReceiveEvent.java index d53d019..0cffa86 100644 --- a/sources/events/internal/VSMessageReceiveEvent.java +++ b/sources/events/internal/VSMessageReceiveEvent.java @@ -59,27 +59,21 @@ public class VSMessageReceiveEvent extends VSAbstractEvent { /* (non-Javadoc) * @see events.VSAbstractEvent#onStart() */ - public boolean onStart() { - boolean returnValue = true; + public void onStart() { boolean onlyRelevantMessages = process.getPrefs().getBoolean( "sim.messages.relevant"); String eventName = message.getName(); String protocolClassname = message.getProtocolClassname(); + if (onlyRelevantMessages && !isRelevantMessage()) + return; + Object protocolObj = null; if (process.objectExists(protocolClassname)) protocolObj = process.getObject(protocolClassname); - if (onlyRelevantMessages) { - if (protocolObj == null) - return false; - - if (!((VSAbstractProtocol) protocolObj).isRelevantMessage(message)) - return false; - } - process.updateLamportTime(message.getLamportTime()+1); process.updateVectorTime(message.getVectorTime()); @@ -91,6 +85,24 @@ public class VSMessageReceiveEvent extends VSAbstractEvent { if (protocolObj != null) ((VSAbstractProtocol) protocolObj).onMessageRecvStart(message); + } + + /** + * Checks if the message delivering is relevant. + * + * @return true, if relevant + */ + public boolean isRelevantMessage() { + String protocolClassname = message.getProtocolClassname(); + Object protocolObj = null; + + if (process.objectExists(protocolClassname)) + protocolObj = process.getObject(protocolClassname); + else + return false; + + if (!((VSAbstractProtocol) protocolObj).isRelevantMessage(message)) + return false; return true; } diff --git a/sources/events/internal/VSProtocolEvent.java b/sources/events/internal/VSProtocolEvent.java index d3efcb2..cfb1e35 100644 --- a/sources/events/internal/VSProtocolEvent.java +++ b/sources/events/internal/VSProtocolEvent.java @@ -107,7 +107,7 @@ public class VSProtocolEvent extends VSAbstractEvent { /* (non-Javadoc) * @see events.VSAbstractEvent#onStart() */ - public boolean onStart() { + public void onStart() { VSAbstractProtocol protocol = process.getProtocolObject(protocolClassname); @@ -131,7 +131,5 @@ public class VSProtocolEvent extends VSAbstractEvent { : prefs.getString("lang.deactivated")); logg(buffer.toString()); - - return true; } } diff --git a/sources/events/internal/VSProtocolScheduleEvent.java b/sources/events/internal/VSProtocolScheduleEvent.java index 3bbac19..912b552 100644 --- a/sources/events/internal/VSProtocolScheduleEvent.java +++ b/sources/events/internal/VSProtocolScheduleEvent.java @@ -104,12 +104,10 @@ public class VSProtocolScheduleEvent extends VSAbstractEvent { /* (non-Javadoc) * @see events.VSAbstractEvent#onStart() */ - public boolean onStart() { + public void onStart() { if (isServerSchedule) protocol.onServerScheduleStart(); else protocol.onClientScheduleStart(); - - return true; } } diff --git a/sources/protocols/VSAbstractProtocol.java b/sources/protocols/VSAbstractProtocol.java index 92c458a..ea3eec2 100644 --- a/sources/protocols/VSAbstractProtocol.java +++ b/sources/protocols/VSAbstractProtocol.java @@ -93,7 +93,7 @@ abstract public class VSAbstractProtocol extends VSAbstractEvent { /* (non-Javadoc) * @see events.VSAbstractEvent#onStart() */ - public final boolean onStart() { + public final void onStart() { if (hasOnServerStart) { if (isServer) { currentContextIsServer(true); @@ -105,8 +105,6 @@ abstract public class VSAbstractProtocol extends VSAbstractEvent { onClientStart(); } } - - return true; } /* (non-Javadoc) @@ -179,10 +177,10 @@ abstract public class VSAbstractProtocol extends VSAbstractEvent { return false; if (message.isServerMessage()) { - if (isServer) + if (!isClient) return false; } else { - if (isClient) + if (!isServer) return false; } diff --git a/sources/simulator/VSSimulatorCanvas.java b/sources/simulator/VSSimulatorCanvas.java index c1ddd65..a40a88d 100644 --- a/sources/simulator/VSSimulatorCanvas.java +++ b/sources/simulator/VSSimulatorCanvas.java @@ -116,6 +116,9 @@ public class VSSimulatorCanvas extends Canvas implements Runnable { /** The message lines. */ private LinkedList<VSMessageLine> messageLines; + /** The message lines to remove. */ + private LinkedList<VSMessageLine> messageLinesToRemove; + /** The processes. */ private Vector<VSProcess> processes; @@ -317,7 +320,6 @@ public class VSSimulatorCanvas extends Canvas implements Runnable { this.isLost = false; this.messageLineNum = ++messageLineCounter; this.task = task; - task.setMessageLine(this); if (senderNum > receiverNum) { //offset1 = 1; @@ -367,11 +369,22 @@ public class VSSimulatorCanvas extends Canvas implements Runnable { g.drawLine((int) x1, (int) y1, (int) x, (int) y); } else if (globalTime >= recvTime) { + if (prefs.getBoolean("sim.messages.relevant")) { + VSMessageReceiveEvent event = + (VSMessageReceiveEvent) task.getEvent(); + + event.init(receiverProcess); + if (!event.isRelevantMessage()) + removeMessageLine(this); + } + isArrived = true; + if (receiverProcess.isCrashed()) color = messageLostColor; else color = messageArrivedColor; + draw(g, globalTime); } else if (outageTime >= 0 && outageTime <= globalTime) { @@ -456,6 +469,7 @@ public class VSSimulatorCanvas extends Canvas implements Runnable { this.logging = logging; this.taskManager = new VSTaskManager(prefs); this.messageLines = new LinkedList<VSMessageLine>(); + this.messageLinesToRemove = new LinkedList<VSMessageLine>(); this.processes = new Vector<VSProcess>(); numProcesses = prefs.getInteger("sim.process.num"); @@ -642,8 +656,11 @@ public class VSSimulatorCanvas extends Canvas implements Runnable { 2 * (YOFFSET + YOUTER_SPACEING))/ numProcesses; xpaintsize_dividedby_untiltime = xPaintSize / (double) untilTime; - for (VSMessageLine messageLine : messageLines) - messageLine.recalcOnChange(); + + synchronized (messageLines) { + for (VSMessageLine messageLine : messageLines) + messageLine.recalcOnChange(); + } /* paintProcesses optimization, precalc things */ { @@ -755,6 +772,14 @@ public class VSSimulatorCanvas extends Canvas implements Runnable { paintGlobalTime(g, globalTime); synchronized (messageLines) { + synchronized (messageLinesToRemove) { + if (messageLinesToRemove.size() > 0) { + for (VSMessageLine removeThis : messageLinesToRemove) + messageLines.remove(removeThis); + messageLinesToRemove.clear(); + } + } + for (VSMessageLine line : messageLines) line.draw(g, globalTime); } @@ -1209,6 +1234,10 @@ public class VSSimulatorCanvas extends Canvas implements Runnable { messageLines.clear(); } + synchronized (messageLinesToRemove) { + messageLinesToRemove.clear(); + } + paint(); logging.clear(); } @@ -1387,9 +1416,9 @@ public class VSSimulatorCanvas extends Canvas implements Runnable { * * @param messageLine the message line to remove */ - public void removeMessageLine(VSMessageLine messageLine) { - synchronized (messageLines) { - messageLines.remove(messageLine); + private void removeMessageLine(VSMessageLine messageLine) { + synchronized (messageLinesToRemove) { + messageLinesToRemove.add(messageLine); } } |
