summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2008-05-31 02:24:26 +0000
committerPaul Buetow <paul@buetow.org>2008-05-31 02:24:26 +0000
commit2b4c9a57ba522cd8dd01dc1f1d2761b66f97e4f2 (patch)
tree97350ff115f7a3751e028c4959256b7a3627c1fe
parent5a41d318c3460beaaeed9d44a1aa3c376956f7b2 (diff)
more elegant way to remove not relevantmessages.
-rw-r--r--sources/core/VSTask.java23
-rw-r--r--sources/events/VSAbstractEvent.java14
-rw-r--r--sources/events/implementations/VSProcessCrashEvent.java4
-rw-r--r--sources/events/implementations/VSProcessRecoverEvent.java4
-rw-r--r--sources/events/internal/VSMessageReceiveEvent.java32
-rw-r--r--sources/events/internal/VSProtocolEvent.java4
-rw-r--r--sources/events/internal/VSProtocolScheduleEvent.java4
-rw-r--r--sources/protocols/VSAbstractProtocol.java8
-rw-r--r--sources/simulator/VSSimulatorCanvas.java41
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);
}
}