summaryrefslogtreecommitdiff
path: root/sources/simulator
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2008-05-24 19:12:20 +0000
committerPaul Buetow <paul@buetow.org>2008-05-24 19:12:20 +0000
commit61e38d3236ead0b32f8fa1a78901e9d0c75c91ea (patch)
tree3d2dde8fa15b4a554a3dc9d90a44df4e38f0d876 /sources/simulator
parenta028afa5f47ed024e792ca11155cd159a146b1e5 (diff)
Processes are now deletable.
Diffstat (limited to 'sources/simulator')
-rw-r--r--sources/simulator/VSSimulation.java19
-rw-r--r--sources/simulator/VSSimulationCanvas.java224
-rw-r--r--sources/simulator/VSSimulatorFrame.java51
3 files changed, 169 insertions, 125 deletions
diff --git a/sources/simulator/VSSimulation.java b/sources/simulator/VSSimulation.java
index cc0ba16..17400cb 100644
--- a/sources/simulator/VSSimulation.java
+++ b/sources/simulator/VSSimulation.java
@@ -822,15 +822,7 @@ public class VSSimulation extends JPanel {
}
private int getSelectedProcessNum() {
- try {
- String string = (String) processesComboBox.getSelectedItem();
- int cutLen = prefs.getString("lang.process").length() + 1;
- string = string.substring(cutLen);
- return Integer.parseInt(string) - 1;
- } catch (NumberFormatException e) {
- }
-
- return simulationCanvas.getNumProcesses();
+ return processesComboBox.getSelectedIndex();
}
private VSProcess getSelectedProcess() {
@@ -879,7 +871,7 @@ public class VSSimulation extends JPanel {
return simulationCanvas;
}
- public VSFrame getSimulatorFrame() {
+ public VSSimulatorFrame getSimulatorFrame() {
return simulatorFrame;
}
@@ -888,6 +880,13 @@ public class VSSimulation extends JPanel {
simulationCanvas.updateFromPrefs();
}
+ public void removeProcessAtIndex(int index) {
+ globalPIDComboBox.removeItemAt(index);
+ localPIDComboBox.removeItemAt(index);
+ processesComboBox.removeItemAt(index);
+ simulatorFrame.updateEditMenu();
+ }
+
public void fireExpertModeChanged() {
boolean expertMode = prefs.getBoolean("sim.mode.expert");
diff --git a/sources/simulator/VSSimulationCanvas.java b/sources/simulator/VSSimulationCanvas.java
index f9fbbe8..8444785 100644
--- a/sources/simulator/VSSimulationCanvas.java
+++ b/sources/simulator/VSSimulationCanvas.java
@@ -21,7 +21,7 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
private VSSimulation simulation;
private VSPrefs prefs;
private VSLogging logging;
- private int numProcesses;
+ private volatile int numProcesses;
private int secondsSpaceing;
private int threadSleep;
private long untilTime;
@@ -39,7 +39,7 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
private volatile long lastTime;
private VSTaskManager taskManager;
private LinkedList<VSMessageLine> messageLines;
- private LinkedList<VSProcess> processes;
+ private Vector<VSProcess> processes;
private double clockSpeed;
private double clockOffset;
private long simulationTime;
@@ -108,11 +108,11 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
this.x = getTimeXPosition(sendTime);
this.y = getProcessYPosition(senderNum) + offset1;
- recalcOnWindowChanged();
+ recalcOnChange();
paint();
}
- public void recalcOnWindowChanged() {
+ public void recalcOnChange() {
x1 = getTimeXPosition(sendTime);
y1 = getProcessYPosition(senderNum) + offset1;
x2 = getTimeXPosition(recvTime);
@@ -162,14 +162,14 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
this.logging = logging;
this.taskManager = new VSTaskManager(prefs);
this.messageLines = new LinkedList<VSMessageLine>();
- this.processes = new LinkedList<VSProcess>();
+ this.processes = new Vector<VSProcess>();
numProcesses = prefs.getInteger("sim.process.num");
updateFromPrefs();
VSProcess.resetProcessCounter();
for (int i = 0; i < numProcesses; ++i)
- createProcess(i);
+ addProcess();
addMouseListener(this);
addMouseMotionListener(this);
@@ -192,7 +192,7 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
int paintGlobalTimeYPosition;
/* This method contains very ugly code. But this has to be in order to gain performance! */
- private void recalcOnWindowChanged() {
+ private void recalcOnChange() {
processlineColor = prefs.getColor("col.process.line");
processSecondlineColor = prefs.getColor("col.process.secondline");
processSeplineColor = prefs.getColor("col.process.sepline");
@@ -206,7 +206,7 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
xpaintsize_dividedby_untiltime = xPaintSize / (double) untilTime;
for (VSMessageLine messageLine : messageLines)
- messageLine.recalcOnWindowChanged();
+ messageLine.recalcOnChange();
/* paintProcesses optimization, precalc things */
{
@@ -242,7 +242,7 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
}
}
- public VSProcess createProcess(int i) {
+ public VSProcess addProcess() {
VSProcess process = new VSProcess(prefs, this, logging);
processes.add(process);
logging.logg(prefs.getString("lang.process.new") + "; " + process);
@@ -272,8 +272,10 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
for (long l = 0; l < offset; ++l)
taskManager.runTasks(l, offset, lastSimulationTime);
- for (VSProcess process : processes)
- process.syncTime(simulationTime);
+ synchronized (processes) {
+ for (VSProcess process : processes)
+ process.syncTime(simulationTime);
+ }
}
public void paint() {
@@ -323,52 +325,54 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
final int xPoints[] = { XOFFSET, xoffset_plus_xpaintsize, xoffset_plus_xpaintsize, XOFFSET, XOFFSET };
final int yPoints[] = { yOffset, yOffset, yOffset + LINE_WIDTH, yOffset + LINE_WIDTH, yOffset };
- for (VSProcess process : processes) {
- final long localTime = process.getTime();
+ synchronized (processes) {
+ for (VSProcess process : processes) {
+ final long localTime = process.getTime();
- g.setColor(process.getColor());
- g.fillPolygon(xPoints, yPoints, 5);
+ g.setColor(process.getColor());
+ g.fillPolygon(xPoints, yPoints, 5);
- if (process.hasCrashed()) {
- g.setColor(process.getCrashedColor());
- final Long crashHistory[] = process.getCrashHistoryArray();
- final int length = crashHistory.length;
+ if (process.hasCrashed()) {
+ g.setColor(process.getCrashedColor());
+ final Long crashHistory[] = process.getCrashHistoryArray();
+ final int length = crashHistory.length;
- for (int i = 0; i < length; i += 2) {
- final int crashStartPos = (int) getTimeXPosition(crashHistory[i].longValue());
- int crashEndPos;
+ for (int i = 0; i < length; i += 2) {
+ final int crashStartPos = (int) getTimeXPosition(crashHistory[i].longValue());
+ int crashEndPos;
- if (i == length - 1)
- crashEndPos = xoffset_plus_xpaintsize;
- else
- crashEndPos = (int) getTimeXPosition(crashHistory[i+1].longValue());
+ if (i == length - 1)
+ crashEndPos = xoffset_plus_xpaintsize;
+ else
+ crashEndPos = (int) getTimeXPosition(crashHistory[i+1].longValue());
- final int xPointsCrashed[] = { crashStartPos, crashEndPos,
- crashEndPos, crashStartPos, crashStartPos
- };
- g.fillPolygon(xPointsCrashed, yPoints, 5);
+ final int xPointsCrashed[] = { crashStartPos, crashEndPos,
+ crashEndPos, crashStartPos, crashStartPos
+ };
+ g.fillPolygon(xPointsCrashed, yPoints, 5);
+ }
}
- }
- g.setColor(process.getColor());
- g.drawString("P" + process.getProcessID() + ":", XOFFSET - 30, yPoints[0] + LINE_WIDTH);
+ g.setColor(process.getColor());
+ g.drawString("P" + process.getProcessID() + ":", XOFFSET - 30, yPoints[0] + LINE_WIDTH);
- final long tmp = localTime > untilTime ? untilTime : localTime;
- final int xPos = 1 + (int) getTimeXPosition(tmp);
- final int yStart = yPoints[0] - 14;
- final int yEnd = yPoints[0];
+ final long tmp = localTime > untilTime ? untilTime : localTime;
+ final int xPos = 1 + (int) getTimeXPosition(tmp);
+ final int yStart = yPoints[0] - 14;
+ final int yEnd = yPoints[0];
- g.setColor(processlineColor);
- g.drawLine(xPos, yStart, xPos, yEnd);
- g.drawString(localTime+"ms", xPos + 2, yStart + TEXT_SPACEING);
+ g.setColor(processlineColor);
+ g.drawLine(xPos, yStart, xPos, yEnd);
+ g.drawString(localTime+"ms", xPos + 2, yStart + TEXT_SPACEING);
- if (showLamport)
- paintTime(g, process.getLamportTimeArray(), process, yStart, 25);
- else if (showVectorTime)
- paintTime(g, process.getVectorTimeArray(), process, yStart, 20 * numProcesses);
+ if (showLamport)
+ paintTime(g, process.getLamportTimeArray(), process, yStart, 25);
+ else if (showVectorTime)
+ paintTime(g, process.getVectorTimeArray(), process, yStart, 20 * numProcesses);
- for (int i = 0; i < 5; ++i)
- yPoints[i] += paintProcessesOffset;
+ for (int i = 0; i < 5; ++i)
+ yPoints[i] += paintProcessesOffset;
+ }
}
}
@@ -548,8 +552,10 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
logging.logg(prefs.getString("lang.simulation.started"));
final long currentTime = System.currentTimeMillis();
- for (VSProcess p : processes)
- p.play();
+ synchronized (processes) {
+ for (VSProcess p : processes)
+ p.play();
+ }
if (isResetted)
isResetted = false;
@@ -571,8 +577,10 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
}
public void finish() {
- for (VSProcess p : processes)
- p.finish();
+ synchronized (processes) {
+ for (VSProcess p : processes)
+ p.finish();
+ }
simulation.finish();
isFinished = true;
@@ -583,8 +591,10 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
public void pause() {
isPaused = true;
- for (VSProcess p : processes)
- p.pause();
+ synchronized (processes) {
+ for (VSProcess p : processes)
+ p.pause();
+ }
pauseTime = System.currentTimeMillis();
@@ -605,14 +615,18 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
clockOffset = 0;
simulationTime = 0;
- for (VSProcess process : processes)
- process.reset();
+ synchronized (processes) {
+ for (VSProcess process : processes)
+ process.reset();
+ }
/* Reset the task manager AFTER the processes, for the programmed tasks */
taskManager.reset();
- for (VSProcess process : processes)
- process.createRandomCrashTask();
+ synchronized (processes) {
+ for (VSProcess process : processes)
+ process.createRandomCrashTask();
+ }
synchronized (messageLines) {
messageLines.clear();
@@ -657,32 +671,34 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
long deliverTime, outageTime, durationTime;
boolean recvOwn = prefs.getBoolean("sim.message.own.recv");
- for (VSProcess receiverProcess : processes) {
- if (receiverProcess.equals(sendingProcess)) {
- if (recvOwn) {
- deliverTime = sendingProcess.getGlobalTime();
- messageReceiveEvent = new MessageReceiveEvent(message);
- task = new VSTask(deliverTime, receiverProcess, messageReceiveEvent, VSTask.GLOBAL);
- taskManager.addTask(task);
- }
+ synchronized (processes) {
+ for (VSProcess receiverProcess : processes) {
+ if (receiverProcess.equals(sendingProcess)) {
+ if (recvOwn) {
+ deliverTime = sendingProcess.getGlobalTime();
+ messageReceiveEvent = new MessageReceiveEvent(message);
+ task = new VSTask(deliverTime, receiverProcess, messageReceiveEvent, VSTask.GLOBAL);
+ taskManager.addTask(task);
+ }
- } else {
- durationTime = sendingProcess.getDurationTime();
- deliverTime = sendingProcess.getGlobalTime() + durationTime;
- outageTime = sendingProcess.getARandomMessageOutageTime(durationTime);
-
- /* Only add a 'receiving message' task if the message will not get lost! */
- if (outageTime == -1) {
- messageReceiveEvent = new MessageReceiveEvent(message);
- task = new VSTask(deliverTime, receiverProcess, messageReceiveEvent, VSTask.GLOBAL);
- taskManager.addTask(task);
- }
+ } else {
+ durationTime = sendingProcess.getDurationTime();
+ deliverTime = sendingProcess.getGlobalTime() + durationTime;
+ outageTime = sendingProcess.getARandomMessageOutageTime(durationTime);
+
+ /* Only add a 'receiving message' task if the message will not get lost! */
+ if (outageTime == -1) {
+ messageReceiveEvent = new MessageReceiveEvent(message);
+ task = new VSTask(deliverTime, receiverProcess, messageReceiveEvent, VSTask.GLOBAL);
+ taskManager.addTask(task);
+ }
- synchronized (messageLines) {
- messageLines.add(
- new VSMessageLine(receiverProcess, sendingProcess.getGlobalTime(),
- deliverTime, outageTime, sendingProcess.getProcessID(),
- receiverProcess.getProcessID()));
+ synchronized (messageLines) {
+ messageLines.add(
+ new VSMessageLine(receiverProcess, sendingProcess.getGlobalTime(),
+ deliverTime, outageTime, sendingProcess.getProcessID(),
+ receiverProcess.getProcessID()));
+ }
}
}
}
@@ -698,42 +714,51 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
String actionCommand = ae.getActionCommand();
- if (actionCommand.equals(prefs.getString("lang.edit"))) {
+ if (actionCommand.equals(prefs.getString("lang.process.edit"))) {
editProcess(process);
- } else if (actionCommand.equals(prefs.getString("lang.crash"))) {
+ } else if (actionCommand.equals(prefs.getString("lang.process.crash"))) {
VSEvent event = new ProcessCrashEvent();
- event.init(process);
+ //event.init(process);
taskManager.addTask(new VSTask(process.getGlobalTime(), process, event, VSTask.GLOBAL));
- } else if (actionCommand.equals(prefs.getString("lang.recover"))) {
+ } else if (actionCommand.equals(prefs.getString("lang.process.recover"))) {
VSEvent event = new ProcessRecoverEvent();
- event.init(process);
+ //event.init(process);
taskManager.addTask(new VSTask(process.getGlobalTime(), process, event, VSTask.GLOBAL));
+
+ } else if (actionCommand.equals(prefs.getString("lang.process.remove"))) {
+ removeProcess(process);
}
}
};
JPopupMenu popup = new JPopupMenu();
- JMenuItem item = new JMenuItem(prefs.getString("lang.edit"));
+ JMenuItem item = new JMenuItem(prefs.getString("lang.process.edit"));
item.addActionListener(actionListener);
popup.add(item);
- item = new JMenuItem(prefs.getString("lang.crash"));
+ item = new JMenuItem(prefs.getString("lang.process.crash"));
if (process.isCrashed() || isPaused || time == 0 || isFinished)
item.setEnabled(false);
else
item.addActionListener(actionListener);
popup.add(item);
- item = new JMenuItem(prefs.getString("lang.recover"));
+ item = new JMenuItem(prefs.getString("lang.process.recover"));
if (!process.isCrashed() || isPaused || time == 0 || isFinished)
item.setEnabled(false);
else
item.addActionListener(actionListener);
popup.add(item);
+ item = new JMenuItem(prefs.getString("lang.process.remove"));
+ item.addActionListener(actionListener);
+ popup.add(item);
+
+ popup.addSeparator();
+
popup.show(me.getComponent(), me.getX(), me.getY());
} else {
@@ -806,14 +831,16 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
public void ancestorMoved(HierarchyEvent e) { }
public void ancestorResized(HierarchyEvent e) {
- recalcOnWindowChanged();
+ recalcOnChange();
}
public ArrayList<VSProcess> getProcessesArray() {
ArrayList<VSProcess> arr = new ArrayList<VSProcess>();
- for (VSProcess process : processes)
- arr.add(process);
+ synchronized (processes) {
+ for (VSProcess process : processes)
+ arr.add(process);
+ }
return arr;
}
@@ -830,6 +857,19 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
if (threadSleep == 0)
threadSleep = 1;
- recalcOnWindowChanged();
+ recalcOnChange();
+ }
+
+ public void removeProcess(VSProcess process) {
+ if (numProcesses == 1) {
+ simulation.getSimulatorFrame().removeSimulation(simulation);
+
+ } else {
+ int index = processes.indexOf(process);
+ processes.remove(index);
+ numProcesses = processes.size();
+ recalcOnChange();
+ simulation.removeProcessAtIndex(index);
+ }
}
}
diff --git a/sources/simulator/VSSimulatorFrame.java b/sources/simulator/VSSimulatorFrame.java
index 8ca7d94..c4abdb3 100644
--- a/sources/simulator/VSSimulatorFrame.java
+++ b/sources/simulator/VSSimulatorFrame.java
@@ -182,16 +182,10 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
pane.add(toolBar, BorderLayout.PAGE_START);
pane.add(tabbedPane, BorderLayout.CENTER);
- /*
- speedSlider = new JSlider(JSlider.HORIZONTAL,
- 0, 200, (int) (100 * prefs.getFloat("sim.clock.speed")));
- toolBar.add(speedSlider);
- */
-
return pane;
}
- private void updateEditMenu() {
+ public void updateEditMenu() {
menuEdit.removeAll();
JMenuItem globalPrefsItem = new JMenuItem(prefs.getString("lang.prefs"));
@@ -210,13 +204,16 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
return;
final String processString = prefs.getString("lang.process");
- final int numProcesses = currentSimulation.getSimulationCanvas().getNumProcesses();
-
- for (int i = 0; i < numProcesses; ++i) {
- JMenuItem processItem = new JMenuItem(processString + " " + (i+1));
- processItem.setAccelerator(KeyStroke.getKeyStroke(0x31+i,
+ final ArrayList<VSProcess> arr = currentSimulation.getSimulationCanvas().getProcessesArray();
+ final int numProcesses = arr.size();
+
+ int processNum = 0;
+ for (VSProcess process : arr) {
+ int processID = process.getProcessID();
+ JMenuItem processItem = new JMenuItem(processString + " " + processID);
+ processItem.setAccelerator(KeyStroke.getKeyStroke(0x31+processID,
ActionEvent.ALT_MASK));
- final int finalProcessNum = i;
+ final int finalProcessNum = processNum++;
processItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
currentSimulation.getSimulationCanvas().editProcess(finalProcessNum);
@@ -242,8 +239,10 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
}
public void dispose() {
- for (VSSimulation simulation : simulations)
- simulation.getSimulationCanvas().stopThread();
+ synchronized (simulations) {
+ for (VSSimulation simulation : simulations)
+ simulation.getSimulationCanvas().stopThread();
+ }
super.dispose();
}
@@ -257,10 +256,7 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
sourceText = ((ImageIcon) ((JButton) source).getIcon()).getDescription();
if (sourceText.equals(prefs.getString("lang.simulation.close"))) {
- if (simulations.size() == 1)
- dispose();
- else
- removeCurrentSimulation();
+ removeCurrentSimulation();
} else if (sourceText.equals(prefs.getString("lang.simulation.new"))) {
VSPrefs newPrefs = VSDefaultPrefs.init();
@@ -334,11 +330,19 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
}
}
+ public void removeSimulation(VSSimulation simulationToRemove) {
+ if (simulations.size() == 1) {
+ dispose();
+
+ } else {
+ simulations.remove(simulationToRemove);
+ tabbedPane.remove(simulationToRemove);
+ simulationToRemove.getSimulationCanvas().stopThread();
+ }
+ }
+
private void removeCurrentSimulation() {
- VSSimulation simulationToRemove = currentSimulation;
- simulations.remove(simulationToRemove);
- tabbedPane.remove(simulationToRemove);
- simulationToRemove.getSimulationCanvas().stopThread();
+ removeSimulation(currentSimulation);
}
public VSSimulation getCurrentSimulation() {
@@ -354,4 +358,5 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
return new ImageIcon(imageURL, descr);
}
+
}