diff --git a/src/avatartranslator/directsimulation/AvatarSimulationBlock.java b/src/avatartranslator/directsimulation/AvatarSimulationBlock.java index 2cdec38a67ad92f4ae6238b1df8886d170516861..5dff83b4b34a03e759f22e0471074cff0bc8afaa 100644 --- a/src/avatartranslator/directsimulation/AvatarSimulationBlock.java +++ b/src/avatartranslator/directsimulation/AvatarSimulationBlock.java @@ -125,7 +125,7 @@ public class AvatarSimulationBlock { return transactions; } - public Vector<AvatarSimulationPendingTransaction> getPendingTransactions(Vector<AvatarSimulationTransaction> _allTransactions, long _clockValue, int _maxTransationsInARow) { + public Vector<AvatarSimulationPendingTransaction> getPendingTransactions(Vector<AvatarSimulationTransaction> _allTransactions, long _clockValue, int _maxTransationsInARow, long _bunchid) { Vector<AvatarSimulationPendingTransaction> ll = new Vector<AvatarSimulationPendingTransaction>(); if (completed) { @@ -140,7 +140,7 @@ public class AvatarSimulationBlock { completed = true; return ll; } - makeExecutedTransaction(_allTransactions, ass, _clockValue, null); + makeExecutedTransaction(_allTransactions, ass, _clockValue, null, _bunchid); } @@ -237,45 +237,45 @@ public class AvatarSimulationBlock { return ll; } - public void runSoloPendingTransaction(AvatarSimulationPendingTransaction _aspt, Vector<AvatarSimulationTransaction> _allTransactions, long _clockValue, int _maxTransationsInARow) { + public void runSoloPendingTransaction(AvatarSimulationPendingTransaction _aspt, Vector<AvatarSimulationTransaction> _allTransactions, long _clockValue, int _maxTransationsInARow, long _bunchid) { if (_aspt.involvedElement != null) { - executeElement(_allTransactions, _aspt.involvedElement, _clockValue, _aspt); + executeElement(_allTransactions, _aspt.involvedElement, _clockValue, _aspt, _bunchid); /*if (lastTransaction != null) { _clockValue = lastTransaction.clockValueWhenFinished; }*/ } - executeElement(_allTransactions, _aspt.elementToExecute, _clockValue, _aspt); + executeElement(_allTransactions, _aspt.elementToExecute, _clockValue, _aspt, _bunchid); //runToNextBlockingElement(_allTransactions, _clockValue, _maxTransationsInARow); } - public void executeElement(Vector<AvatarSimulationTransaction>_allTransactions, AvatarStateMachineElement _elt, long _clockValue, AvatarSimulationPendingTransaction _aspt) { + public void executeElement(Vector<AvatarSimulationTransaction>_allTransactions, AvatarStateMachineElement _elt, long _clockValue, AvatarSimulationPendingTransaction _aspt, long _bunchid) { // Stop state if (_elt instanceof AvatarStopState) { - makeExecutedTransaction(_allTransactions, _elt, _clockValue, _aspt); + makeExecutedTransaction(_allTransactions, _elt, _clockValue, _aspt, _bunchid); // Random } else if (_elt instanceof AvatarState) { - makeExecutedTransaction(_allTransactions, _elt, _clockValue, _aspt); + makeExecutedTransaction(_allTransactions, _elt, _clockValue, _aspt, _bunchid); // Random } else if (_elt instanceof AvatarRandom) { - makeExecutedTransaction(_allTransactions, _elt, _clockValue, _aspt); + makeExecutedTransaction(_allTransactions, _elt, _clockValue, _aspt, _bunchid); // Transition } else if (_elt instanceof AvatarTransition) { - makeExecutedTransaction(_allTransactions, _elt, _clockValue, _aspt); + makeExecutedTransaction(_allTransactions, _elt, _clockValue, _aspt, _bunchid); // Signal } else if (_elt instanceof AvatarActionOnSignal) { - makeExecutedTransaction(_allTransactions, _elt, _clockValue, _aspt); + makeExecutedTransaction(_allTransactions, _elt, _clockValue, _aspt, _bunchid); } } - public void makeExecutedTransaction(Vector<AvatarSimulationTransaction> _allTransactions, AvatarStateMachineElement _elt, long _clockValue, AvatarSimulationPendingTransaction _aspt) { + public void makeExecutedTransaction(Vector<AvatarSimulationTransaction> _allTransactions, AvatarStateMachineElement _elt, long _clockValue, AvatarSimulationPendingTransaction _aspt, long _bunchid) { AvatarTransition at; String action; int i; @@ -290,6 +290,7 @@ public class AvatarSimulationBlock { ast.asb = this; ast.concernedElement = null; ast.initialClockValue = 0; + ast.bunchid = _bunchid; if (lastTransaction != null) { ast.initialClockValue = lastTransaction.clockValueWhenFinished; } @@ -593,7 +594,11 @@ public class AvatarSimulationBlock { public void removeLastTransaction(AvatarSimulationTransaction _ast) { if (lastTransaction == _ast) { transactions.removeElementAt(transactions.size()-1); - lastTransaction = transactions.get(transactions.size()-1); + if (transactions.size() > 0) { + lastTransaction = transactions.get(transactions.size()-1); + } else { + lastTransaction = null; + } } } diff --git a/src/avatartranslator/directsimulation/AvatarSimulationTransaction.java b/src/avatartranslator/directsimulation/AvatarSimulationTransaction.java index b3553622414db85123bc98575457a3f0d8d969aa..3a36618029ff9a209f8608c32ef22c733e55b714 100644 --- a/src/avatartranslator/directsimulation/AvatarSimulationTransaction.java +++ b/src/avatartranslator/directsimulation/AvatarSimulationTransaction.java @@ -66,6 +66,7 @@ public class AvatarSimulationTransaction { public long duration; public long clockValueWhenFinished; public long id; + public long bunchid; // Indicates whether the transaction is a silent transaction, or not // Silent means that the transaction was automatically selecteed by the simulator -> @@ -105,8 +106,12 @@ public class AvatarSimulationTransaction { return tmp; } + public static synchronized void setID(long _id) { + ID = _id; + } + public String toString() { - String res = "" + id + " @" + clockValueWhenFinished + "/ " + duration + ": " +executedElement + " in block " + block.getName(); + String res = "" + id + " bunchid:" + bunchid + " @" + clockValueWhenFinished + "/ " + duration + ": " +executedElement + " in block " + block.getName(); if (silent) { res += " (silent)"; } diff --git a/src/avatartranslator/directsimulation/AvatarSpecificationSimulation.java b/src/avatartranslator/directsimulation/AvatarSpecificationSimulation.java index 4dc79d5f54a4545039dacfa53114b891f080a02b..a74fe77c4881779ed7c221a4f41b24ac3cdcd81b 100644 --- a/src/avatartranslator/directsimulation/AvatarSpecificationSimulation.java +++ b/src/avatartranslator/directsimulation/AvatarSpecificationSimulation.java @@ -56,12 +56,17 @@ import myutil.*; public class AvatarSpecificationSimulation { private static int MAX_TRANSACTION_IN_A_ROW = 1000; - public final static int OTHER = 0; - public final static int STOPPED = 1; - public final static int RUNNING = 2; - public final static int TERMINATED = 3; + public static int MAX_TRANSACTIONS = 100000000; - private int mode; + public final static int INITIALIZE = 0; + public final static int RESET = 1; + public final static int GATHER = 2; + public final static int EXECUTE = 3; + public final static int DONT_EXECUTE = 4; + public final static int TERMINATED = 5; + public final static int KILLED = 6; + + private int state; private AvatarSpecification avspec; private AvatarSimulationInteraction asi; @@ -73,8 +78,14 @@ public class AvatarSpecificationSimulation { //private Vector<AvatarSimulationPendingTransaction> pendingTimedTransactions; private Vector<AvatarSimulationTransaction> allTransactions; + private boolean go = false; private boolean stopped = false; private boolean killed = false; + private boolean reset = false; + private boolean newState = false; + + private long bunchid; + private int nbOfCommands = -1; // means: until it blocks private int indexSelectedTransaction = -1; @@ -91,6 +102,8 @@ public class AvatarSpecificationSimulation { iee = new IntExpressionEvaluator(); executeEmptyTransition = true; executeStateEntering = true; + + setState(INITIALIZE); } public AvatarSpecification getAvatarSpecification() { @@ -116,17 +129,20 @@ public class AvatarSpecificationSimulation { // Remove timers avspec.removeTimers(); - - reset(); } public void reset() { - killed = false; - unsetNbOfCommands(); // Reinit clock clockValue = 0; + // Reinit bunch id + bunchid = 0; + + // Stop the first transaction + unsetNbOfCommands(); + stopped = true; + // Reinit simulation AvatarSimulationTransaction.reinit(); @@ -145,13 +161,14 @@ public class AvatarSpecificationSimulation { // Create the structure for pending and executed transactions pendingTransactions = new Vector<AvatarSimulationPendingTransaction>(); allTransactions = new Vector<AvatarSimulationTransaction>(); + } public boolean isInDeadlock() { return true; } - public void runSimulation() { + /*public void runSimulation() { setMode(RUNNING); int index[]; Vector<AvatarSimulationPendingTransaction> selectedTransactions; @@ -161,65 +178,276 @@ public class AvatarSpecificationSimulation { TraceManager.addDev("Simulation started at time: " + clockValue); - while((go == true) && !killed) { + while(!killed) { while((go == true) && !killed) { - gatherPendingTransactions(); + while((go == true) && !killed) { + gatherPendingTransactions(); + + if (pendingTransactions.size() == 0) { + go = false; + TraceManager.addDev("No more pending transactions"); + } else { + + if (stopped && go) { + setMode(STOPPED); + TraceManager.addDev("Simulation waiting for run"); + waitForUnstopped(); + if (go) { + setMode(RUNNING); + } + } else if (nbOfCommands == 0) { + if (getSilentTransactionToExecute(pendingTransactions) == null) { + stopSimulation(); + stopSimulation(go); + } + } + + if (!killed) { + silentTransactionExecuted = false; + selectedTransactions = selectTransactions(pendingTransactions); + + if (selectedTransactions.size() == 0) { + go = false; + TraceManager.addDev("Deadlock: no transaction can be selected"); + } else { + //TraceManager.addDev("* * * * * Nb of selected transactions: " + selectedTransactions.size()); + go = performSelectedTransactions(selectedTransactions); + //TraceManager.addDev("NbOfcommands=" + nbOfCommands); + if (!silentTransactionExecuted) { + nbOfCommands --; + } + if (asi != null) { + asi.updateTransactionAndTime(allTransactions.size(), clockValue); + }g + //TraceManager.addDev("------------- new NbOfcommands=" + nbOfCommands); + } + } + } + } + } + setMode(TERMINATED); + TraceManager.addDev("Simulation finished at time: " + clockValue + "\n--------------------------------------"); + waitForKillResetOrBackward(); + go = true; + } + + setMode(KILLED); + //printExecutedTransactions(); + }*/ + + // Control function + + public void runSimulation() { + int index[]; + Vector<AvatarSimulationPendingTransaction> selectedTransactions; + + TraceManager.addDev("Simulation started at time: " + clockValue); + + //boolean executeNextState; + + while(true) { + //TraceManager.addDev("State=" + state); + switch(state) { + case INITIALIZE: + initialize(); + setState(RESET); + break; + + case RESET: + reset(); + setState(GATHER); + break; + case GATHER: + gatherPendingTransactions(); if (pendingTransactions.size() == 0) { - go = false; + setState(TERMINATED); TraceManager.addDev("No more pending transactions"); } else { - - if (stopped && go) { - setMode(STOPPED); - TraceManager.addDev("Simulation waiting for run"); - waitForUnstopped(); - if (go) { - setMode(RUNNING); - } - } else if (nbOfCommands == 0) { + if (nbOfCommands < 1) { if (getSilentTransactionToExecute(pendingTransactions) == null) { - stopSimulation(); - stopSimulation(go); + setState(DONT_EXECUTE); + } else { + setState(EXECUTE); } + } else { + setState(EXECUTE); } - - if (!killed) { - silentTransactionExecuted = false; - selectedTransactions = selectTransactions(pendingTransactions); - - if (selectedTransactions.size() == 0) { - go = false; - TraceManager.addDev("Deadlock: no transaction can be selected"); - } else { - //TraceManager.addDev("* * * * * Nb of selected transactions: " + selectedTransactions.size()); - go = performSelectedTransactions(selectedTransactions); - //TraceManager.addDev("NbOfcommands=" + nbOfCommands); - if (!silentTransactionExecuted) { - nbOfCommands --; - } - if (asi != null) { - asi.updateTransactionAndTime(allTransactions.size(), clockValue); - } - //TraceManager.addDev("------------- new NbOfcommands=" + nbOfCommands); + } + + break; + + case EXECUTE: + silentTransactionExecuted = false; + selectedTransactions = selectTransactions(pendingTransactions); + + if (selectedTransactions.size() == 0) { + setState(TERMINATED); + TraceManager.addDev("Deadlock: no transaction can be selected"); + } else { + if (performSelectedTransactions(selectedTransactions)) { + if (!silentTransactionExecuted) { + nbOfCommands --; + } + if (asi != null) { + asi.updateTransactionAndTime(allTransactions.size(), clockValue); } + setState(GATHER); + } else { + setState(TERMINATED); + TraceManager.addDev("Error when executing transaction"); } } + break; + + case DONT_EXECUTE: + waitForExecute(); + break; + + case TERMINATED: + waitForResetOrNewState(); + break; + + case KILLED: + TraceManager.addDev("Simulation killed"); + return; + + default: + TraceManager.addDev("Unknown state"); + setState(KILLED); } + + computeExternalCommands(); } - setMode(TERMINATED); - TraceManager.addDev("Simulation finished at time: " + clockValue + "\n--------------------------------------"); - //printExecutedTransactions(); + } + public synchronized void waitForExecute() { + while(!reset && !newState && !killed && !go) { + try { + wait(); + } catch(Exception e){} + } + } + + public synchronized void waitForResetOrNewState() { + while(!reset && !newState && !killed) { + try { + wait(); + } catch(Exception e){} + } + } + + public synchronized void computeExternalCommands() { + + + if (state == KILLED) { + return; + } + + if (killed) { + killed = false; + reset = false; + newState = false; + stopped = false; + setState(KILLED); + return; + } + + if (state == RESET) { + return; + } + + if (reset) { + reset = false; + newState = false; + stopped = false; + setState(RESET); + return; + } + + if (newState) { + newState = false; + setState(GATHER); + TraceManager.addDev("Going to gather"); + return; + } + + if (stopped && (state == EXECUTE)) { + stopped = false; + setState(DONT_EXECUTE); + } + + if (go && (state == DONT_EXECUTE)) { + go = false; + setState(EXECUTE); + } + + return; + } + + public void setState(int _state) { + state = _state; + + if (state == DONT_EXECUTE) { + unsetNbOfCommands(); + } + + if (asi != null) { + asi.setMode(state); + } + } + + public int getState() { + return state; + } + + public void setNbOfCommands(int _nbOfCommands) { + nbOfCommands = _nbOfCommands; + } + + public void unsetNbOfCommands() { + nbOfCommands = -1; + } + + // External control functions + public synchronized void killSimulation() { + killed = true; + notifyAll(); + } + + public synchronized void resetSimulation() { + TraceManager.addDev("reset on simulation"); + reset = true; + notifyAll(); + } + + public synchronized void newStateInSimulation() { + newState = true; + notifyAll(); + } + + public synchronized void stopSimulation() { + stopped = true; + notifyAll(); + } + + public synchronized void goSimulation() { + go = true; + notifyAll(); + } + + + // Simulation functions + public void gatherPendingTransactions() { AvatarTransition tr; pendingTransactions.clear(); // Gather all pending transactions from blocks for(AvatarSimulationBlock asb: blocks) { - pendingTransactions.addAll(asb.getPendingTransactions(allTransactions, clockValue, MAX_TRANSACTION_IN_A_ROW)); + pendingTransactions.addAll(asb.getPendingTransactions(allTransactions, clockValue, MAX_TRANSACTION_IN_A_ROW, bunchid)); } //TraceManager.addDev("# of pending transactions before selection: " + pendingTransactions.size()); @@ -543,28 +771,28 @@ public class AvatarSpecificationSimulation { if (_pendingTransactions.size() == 1) { long tempo_clock_Value = clockValue; preExecutedTransaction(_pendingTransactions.get(0)); - _pendingTransactions.get(0).asb.runSoloPendingTransaction(_pendingTransactions.get(0), allTransactions, tempo_clock_Value, MAX_TRANSACTION_IN_A_ROW); + _pendingTransactions.get(0).asb.runSoloPendingTransaction(_pendingTransactions.get(0), allTransactions, tempo_clock_Value, MAX_TRANSACTION_IN_A_ROW, bunchid); postExecutedTransaction(_pendingTransactions.get(0)); previousBlock = _pendingTransactions.get(0).asb; if (_pendingTransactions.get(0).linkedTransaction != null) { tempo_clock_Value = clockValue; AvatarSimulationTransaction transaction0 = _pendingTransactions.get(0).asb.getLastTransaction(); preExecutedTransaction(_pendingTransactions.get(0).linkedTransaction); - _pendingTransactions.get(0).linkedTransaction.asb.runSoloPendingTransaction(_pendingTransactions.get(0).linkedTransaction, allTransactions, tempo_clock_Value, MAX_TRANSACTION_IN_A_ROW); + _pendingTransactions.get(0).linkedTransaction.asb.runSoloPendingTransaction(_pendingTransactions.get(0).linkedTransaction, allTransactions, tempo_clock_Value, MAX_TRANSACTION_IN_A_ROW, bunchid); postExecutedTransaction(_pendingTransactions.get(0).linkedTransaction); AvatarSimulationTransaction transaction1 = _pendingTransactions.get(0).linkedTransaction.asb.getLastTransaction(); transaction1.linkedTransaction = transaction0; } + if (!(_pendingTransactions.get(0).isSilent)) { + bunchid++; + } return true; - } else if (_pendingTransactions.size() == 1) { // synchro - //Not yet handled - return false; - } else { - // error! - return false; } + + return false; + } public void preExecutedTransaction(AvatarSimulationPendingTransaction _aspt) { @@ -619,8 +847,8 @@ public class AvatarSpecificationSimulation { clockValue = _aspt.clockValueAtEnd; } - public synchronized void backOneTransaction(boolean _ignoredSilent) { - if (mode != STOPPED) { + public synchronized void backOneTransactionBunch() { + if ( (state != DONT_EXECUTE) && (state != TERMINATED)) { return; } @@ -628,29 +856,61 @@ public class AvatarSpecificationSimulation { return; } + TraceManager.addDev("Backward size="+ allTransactions.size()); + // Remove one transaction // Getting last transaction + AvatarSimulationTransaction ast = allTransactions.get(allTransactions.size()-1); - allTransactions.removeElementAt(allTransactions.size()-1); + long bunchid = ast.bunchid; - if (ast.asb != null) { - ast.asb.removeLastTransaction(ast); - } + boolean isAllSilent = true; - // Must handle asynchronous messages - if (ast.receivedMessage != null) { - asynchronousMessages.add(0, ast.receivedMessage); + while((ast != null) && (ast.bunchid == bunchid)) { + allTransactions.removeElementAt(allTransactions.size()-1); + if (ast.asb != null) { + ast.asb.removeLastTransaction(ast); + } + + if (!ast.silent) { + isAllSilent = false; + } + + // Must handle asynchronous messages + if (ast.receivedMessage != null) { + asynchronousMessages.add(0, ast.receivedMessage); + } + + if (ast.sentMessage != null) { + asynchronousMessages.remove(ast.sentMessage); + } + + if (allTransactions.size() > 0) { + ast = allTransactions.get(allTransactions.size()-1); + } else { + ast = null; + } } - if (ast.sentMessage != null) { - asynchronousMessages.remove(ast.sentMessage); + if (ast != null) { + bunchid = (allTransactions.get(allTransactions.size()-1).bunchid) + 1; + clockValue = ast.clockValueWhenFinished; + } else { + bunchid = 0; + clockValue = 0; } - if ((ast.silent) && (!_ignoredSilent)) { - backOneTransaction(_ignoredSilent); + AvatarSimulationTransaction.setID(allTransactions.size()); + + + TraceManager.addDev("Backward size="+ allTransactions.size()); + + if (isAllSilent) { + backOneTransactionBunch(); } - gatherPendingTransactions(); + newState = true; + notifyAll(); } public void printExecutedTransactions() { @@ -659,6 +919,14 @@ public class AvatarSpecificationSimulation { } } + /*public synchronized void waitForKillResetOrBackward() { + while(stopped && !killed) { + try { + wait(); + } catch (Exception e) { + } + } + } public synchronized void waitForUnstopped() { while(stopped && !killed) { @@ -699,6 +967,8 @@ public class AvatarSpecificationSimulation { } } + + public void setNbOfCommands(int _nbOfCommands) { nbOfCommands = _nbOfCommands; } @@ -715,7 +985,7 @@ public class AvatarSpecificationSimulation { if (_go && !killed) { setMode(RUNNING); } - } + }*/ public AvatarSimulationBlock getPreviousBlock() { return previousBlock; diff --git a/src/ui/avatarinteractivesimulation/AvatarInteractiveSimulationActions.java b/src/ui/avatarinteractivesimulation/AvatarInteractiveSimulationActions.java index 834a8ce8af1b3af79922b613432adfa0fad56e1b..3a7c7202ba0c40ed12ae635128c7c0deec5ba53a 100755 --- a/src/ui/avatarinteractivesimulation/AvatarInteractiveSimulationActions.java +++ b/src/ui/avatarinteractivesimulation/AvatarInteractiveSimulationActions.java @@ -143,7 +143,7 @@ public class AvatarInteractiveSimulationActions extends AbstractAction { actions[ACT_RUN_X_TRANSACTIONS] = new TAction("run-x-transactions", "Run x transactions", IconManager.imgic1306, IconManager.imgic1306, "Run x transactions", "Run simulation for x transactions. Works only if the simulator is \"ready\"", 'R'); actions[ACT_RUN_X_COMMANDS] = new TAction("run-x-commands", "Run x commands", IconManager.imgic1308, IconManager.imgic1308, "Run x commands", "Run simulation for x commands. Works only if the simulator is \"ready\"", 'R'); - actions[ACT_BACK_ONE] = new TAction("back-one", "Back one transaction", IconManager.imgic46, IconManager.imgic47, "Back one transaction", "Go one transaction backward", 'B'); + actions[ACT_BACK_ONE] = new TAction("back-one", "Back one transaction", IconManager.imgic47, IconManager.imgic47, "Back one transaction", "Go one transaction backward", 'B'); actions[ACT_RUN_EXPLORATION] = new TAction("run-exploration", "Run exploration", IconManager.imgic1326, IconManager.imgic1326, "Run exploration", "Explore branches of the simulation", 'R'); diff --git a/src/ui/avatarinteractivesimulation/BlockTableModel.java b/src/ui/avatarinteractivesimulation/BlockTableModel.java index a3f024acb75f104dcd3541ae36e75266c0bfddfe..f4676aaadc0a9e2b2bfcd60ca1bccc3a4d0da5b8 100755 --- a/src/ui/avatarinteractivesimulation/BlockTableModel.java +++ b/src/ui/avatarinteractivesimulation/BlockTableModel.java @@ -65,6 +65,10 @@ public class BlockTableModel extends AbstractTableModel { // From AbstractTableModel public int getRowCount() { + + if (nbOfRows == -1) { + computeData(); + } return nbOfRows; } @@ -138,7 +142,11 @@ public class BlockTableModel extends AbstractTableModel { return ; } - nbOfRows = ass.getSimulationBlocks().size(); + if (ass.getSimulationBlocks() != null) { + nbOfRows = ass.getSimulationBlocks().size(); + } + + nbOfRows = -1; return; } diff --git a/src/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java b/src/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java index fa60684bf98a5e708cdac4dc7a88082f029c5265..537af06e7db0f60c289117f76034401dd19f11fa 100755 --- a/src/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java +++ b/src/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java @@ -204,18 +204,27 @@ public class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS nbOfAllExecutedElements = 0; resetMetElements(); ass = new AvatarSpecificationSimulation(avspec, this); - ass.initialize(); + //ass.initialize(); simulationThread = new Thread(this); simulationThread.start(); } public void run() { + previousTime = System.currentTimeMillis(); + ass.runSimulation(); + TraceManager.addDev("Simulation thread ended"); + } + + /*public void run() { resetThread = false; killThread = false; previousTime = System.currentTimeMillis(); - ass.runSimulation(); + if (ass.getState() == AvatarSpecificationSimulation.INITIALIZE) { + ass.runSimulation(); + } + if (killThread) { return; } @@ -231,7 +240,7 @@ public class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS runningTGComponents = new LinkedList<TGComponent>(); nbOfAllExecutedElements = 0; resetMetElements(); - ass.reset(); + ass.resetSimulation(); previousTime = System.currentTimeMillis(); run(); } @@ -257,7 +266,7 @@ public class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS resetThread = true; TraceManager.addDev("Reset thread = " + resetThread); notifyAll(); - } + }*/ @@ -687,8 +696,10 @@ public class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS } public void close() { - killThread(); - ass.killSimulation(); + //killThread(); + if (ass != null) { + ass.killSimulation(); + } dispose(); setVisible(false); runningTGComponents.clear(); @@ -698,7 +709,10 @@ public class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS public void runSimulation() { previousTime = System.currentTimeMillis(); - ass.unstop(); + if (ass != null) { + ass.setNbOfCommands(AvatarSpecificationSimulation.MAX_TRANSACTIONS); + ass.goSimulation(); + } } public void runXCommands() { @@ -709,22 +723,32 @@ public class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS } catch (Exception e) { nb = 1; } - ass.setNbOfCommands(nb); - previousTime = System.currentTimeMillis(); - ass.unstop(); + if (ass != null) { + ass.setNbOfCommands(nb); + previousTime = System.currentTimeMillis(); + ass.goSimulation(); + } } public void stopSimulation() { - ass.stopSimulation(); + //previousTime = System.currentTimeMillis(); + if (ass != null) { + ass.stopSimulation(); + } } public void resetSimulation() { - resetThread(); - ass.killSimulation(); + //resetThread(); + previousTime = System.currentTimeMillis(); + if (ass != null) { + ass.resetSimulation(); + } + //ass.killSimulation(); } public void backwardOneTransaction() { - ass.backOneTransaction(true); + previousTime = System.currentTimeMillis(); + ass.backOneTransactionBunch(); } @@ -768,7 +792,7 @@ public class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS // Diagram animation? - if (!(busyMode == AvatarSpecificationSimulation.RUNNING)) { + if (!(busyMode == AvatarSpecificationSimulation.GATHER) && !(busyMode == AvatarSpecificationSimulation.EXECUTE)) { updateMetElements(); animateDiagrams(); } @@ -789,15 +813,18 @@ public class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS boolean b= true; switch(busyMode) { - case AvatarSpecificationSimulation.STOPPED: + case AvatarSpecificationSimulation.DONT_EXECUTE: actions[AvatarInteractiveSimulationActions.ACT_RUN_SIMU].setEnabled(true); + actions[AvatarInteractiveSimulationActions.ACT_BACK_ONE].setEnabled(true); actions[AvatarInteractiveSimulationActions.ACT_RUN_X_COMMANDS].setEnabled(true); actions[AvatarInteractiveSimulationActions.ACT_RESET_SIMU].setEnabled(true); actions[AvatarInteractiveSimulationActions.ACT_STOP_SIMU].setEnabled(false); b = true; break; - case AvatarSpecificationSimulation.RUNNING: + case AvatarSpecificationSimulation.GATHER: + case AvatarSpecificationSimulation.EXECUTE: actions[AvatarInteractiveSimulationActions.ACT_RUN_SIMU].setEnabled(false); + actions[AvatarInteractiveSimulationActions.ACT_BACK_ONE].setEnabled(false); actions[AvatarInteractiveSimulationActions.ACT_RUN_X_COMMANDS].setEnabled(false); actions[AvatarInteractiveSimulationActions.ACT_RESET_SIMU].setEnabled(false); actions[AvatarInteractiveSimulationActions.ACT_STOP_SIMU].setEnabled(true); @@ -805,6 +832,17 @@ public class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS break; case AvatarSpecificationSimulation.TERMINATED: actions[AvatarInteractiveSimulationActions.ACT_RUN_SIMU].setEnabled(false); + actions[AvatarInteractiveSimulationActions.ACT_BACK_ONE].setEnabled(true); + actions[AvatarInteractiveSimulationActions.ACT_RUN_X_COMMANDS].setEnabled(false); + actions[AvatarInteractiveSimulationActions.ACT_RESET_SIMU].setEnabled(true); + actions[AvatarInteractiveSimulationActions.ACT_STOP_SIMU].setEnabled(false); + b = true; + break; + case AvatarSpecificationSimulation.INITIALIZE: + case AvatarSpecificationSimulation.RESET: + case AvatarSpecificationSimulation.KILLED: + actions[AvatarInteractiveSimulationActions.ACT_RUN_SIMU].setEnabled(false); + actions[AvatarInteractiveSimulationActions.ACT_BACK_ONE].setEnabled(false); actions[AvatarInteractiveSimulationActions.ACT_RUN_X_COMMANDS].setEnabled(false); actions[AvatarInteractiveSimulationActions.ACT_RESET_SIMU].setEnabled(true); actions[AvatarInteractiveSimulationActions.ACT_STOP_SIMU].setEnabled(false); @@ -853,15 +891,22 @@ public class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS newTime += " (before:" + oldTime + ")"; } time.setText(newTime); - info.setText(""+ass.getAllTransactions().size()); + if (ass.getAllTransactions() != null) { + info.setText(""+ass.getAllTransactions().size()); + } else { + info.setText("0"); + } switch(busyMode) { - case AvatarSpecificationSimulation.STOPPED: + case AvatarSpecificationSimulation.DONT_EXECUTE: status.setText("Stopped"); status.setForeground(ColorManager.InteractiveSimulationText_UNKNOWN); time.setForeground(ColorManager.InteractiveSimulationText_UNKNOWN); info.setForeground(ColorManager.InteractiveSimulationText_UNKNOWN); break; - case AvatarSpecificationSimulation.RUNNING: + case AvatarSpecificationSimulation.GATHER: + case AvatarSpecificationSimulation.EXECUTE: + case AvatarSpecificationSimulation.RESET: + case AvatarSpecificationSimulation.INITIALIZE: status.setText("Running..."); status.setForeground(ColorManager.InteractiveSimulationText_BUSY); time.setForeground(ColorManager.InteractiveSimulationText_BUSY); @@ -873,12 +918,23 @@ public class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS time.setForeground(ColorManager.InteractiveSimulationText_TERM); info.setForeground(ColorManager.InteractiveSimulationText_TERM); break; + case AvatarSpecificationSimulation.KILLED: + status.setText("killed"); + status.setForeground(ColorManager.InteractiveSimulationText_TERM); + time.setForeground(ColorManager.InteractiveSimulationText_TERM); + info.setForeground(ColorManager.InteractiveSimulationText_TERM); + break; } } } public void setContentOfListOfPendingTransactions() { + if (ass == null) { + return; + } + Vector<AvatarSimulationPendingTransaction> ll = ass.getPendingTransitions(); + try { listPendingTransactions.clearSelection(); selectedComponentForTransaction = null; @@ -904,6 +960,11 @@ public class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS TGComponent tgc; Object o; + if (allExecutedElements == null) { + nbOfAllExecutedElements = 0; + return; + } + if (allExecutedElements.size() > nbOfAllExecutedElements) { for(int i=nbOfAllExecutedElements; i<allExecutedElements.size(); i++) { o = allExecutedElements.get(i).getReferenceObject(); @@ -919,7 +980,7 @@ public class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS public void animateDiagrams() { - if (animate != null) { + if ((animate != null) && (ass != null) && (ass.getSimulationBlocks() != null)) { if (animate.isSelected()) { // We go through all blocks runningTGComponents.clear(); @@ -1047,7 +1108,7 @@ public class JFrameAvatarInteractiveSimulation extends JFrame implements AvatarS //TraceManager.addDev("Adding reference object: " + aspt.linkedTransaction.elementToExecute.getReferenceObject()); selectedComponentForTransaction = (TGComponent)(aspt.linkedTransaction.elementToExecute.getReferenceObject()); } - if (!(busyMode == AvatarSpecificationSimulation.RUNNING)) { + if (!(busyMode == AvatarSpecificationSimulation.GATHER) && !(busyMode == AvatarSpecificationSimulation.EXECUTE)) { ass.setIndexSelectedTransaction(listPendingTransactions.getSelectedIndex()); } if (animate.isSelected() && (openDiagram.isSelected())) {