boolean isChanged = updateEdge(currentNode, nodeToProcess);
// Check for a conflict in this transition(currentNode -> nodeToProcess)
- if (checkForConflict(currentNode))
+ if (checkForConflict(nodeToProcess))
return true;
// Checking if the out set has changed or not(Add its successors to the change list!)
if (isChanged) {
- for (Node i : nodeToProcess.getSuccessors()) {
- if (!changed.contains(i))
- changed.add(i);
- }
+ propagateTheChange(nodeToProcess);
}
}
" to the variable: "+pair.getVarName()+" while App"+
writerMap.get(pair.getVarName())+" is overwriting the value: "
+valueMap.get(pair.getVarName())+" to the same variable!";
+ System.out.println(message);
return message;
}
HashMap<String, String> valueMap = new HashMap<String, String>(); // HashMap from varName to value
HashMap<String, Integer> writerMap = new HashMap<String, Integer>(); // HashMap from varName to appNum
-
// Update the valueMap
for (int i = 0;i < nodeToProcess.getSetSet().size();i++) {
NameValuePair nameValuePair = nodeToProcess.getSetSet().get(i);
boolean updateEdge(Node parentNode, Node currentNode) {
ArrayList<NameValuePair> setSet = currentNode.getSetSetMap().get(parentNode);
HashSet<String> updatedVarNames = new HashSet<String>();
- boolean isChanged = false;
+ HashMap<Integer, String> writerLastValue = new HashMap<Integer, String>();
- for (int i = 0;i < setSet.size();i++) {
- updatedVarNames.add(setSet.get(i).getVarName());
+ boolean isChanged = false;
+
+ if (setSet != null) {
+ for (int i = 0;i < setSet.size();i++) {
+ updatedVarNames.add(setSet.get(i).getVarName());
+ writerLastValue.put(setSet.get(i).getAppNum(), setSet.get(i).getValue());
+ }
}
for (NameValuePair i : parentNode.getOutSet()) {
isChanged |= currentNode.getOutSet().add(i);
}
- for (int i = 0;i < setSet.size();i++) {
- isChanged |= currentNode.getOutSet().add(setSet.get(i));
+ if (setSet != null) {
+ for (int i = 0;i < setSet.size();i++) {
+ if (setSet.get(i).getValue().equals(writerLastValue.get(setSet.get(i).getAppNum()))) {
+ isChanged |= currentNode.getOutSet().add(setSet.get(i));
+ }
+ }
}
return isChanged;
// Check for the conflict in this edge
conflictFound = checkForConflict(currentNode);
-
+
// Check if the outSet of this state has changed, update all of its successors' sets if any
if (isChanged)
conflictFound = conflictFound || propagateTheChange(currentNode);
@Override
public void instructionExecuted(VM vm, ThreadInfo ti, Instruction nextInsn, Instruction executedInsn) {
- // Instantiate timeoutTimer
if (timeout > 0) {
if (System.currentTimeMillis() - startTime > timeout) {
StringBuilder sbTimeOut = new StringBuilder();
} else {
if (executedInsn instanceof WriteInstruction) {
String varId = ((WriteInstruction) executedInsn).getFieldInfo().getFullName();
+
for (String var : conflictSet) {
if (varId.contains(var)) {
// Get variable info