fix a bug and print predicate tree in xdot syntax
[c11tester.git] / cyclegraph.cc
index 5d894f848d474444d4c482ae214e7f384a58be5d..e56c91285d36dd4d78374fafe9fd313ee46be0d6 100644 (file)
@@ -133,10 +133,40 @@ void CycleGraph::addRMWEdge(const ModelAction *from, const ModelAction *rmw)
                }
        }
        fromnode->edges.clear();
-       
+
        addNodeEdge(fromnode, rmwnode, true);
 }
 
+void CycleGraph::addEdges(SnapList<ModelAction *> * edgeset, const ModelAction *to) {
+       for(sllnode<ModelAction*> * it = edgeset->begin();it!=NULL;) {
+               ModelAction *act = it->getVal();
+               CycleNode *node = getNode(act);
+               sllnode<ModelAction*> * it2 = it;
+               it2=it2->getNext();
+               for(;it2!=NULL; ) {
+                       ModelAction *act2 = it2->getVal();
+                       CycleNode *node2 = getNode(act2);
+                       if (checkReachable(node, node2)) {
+                               it = edgeset->erase(it);
+                               goto endouterloop;
+                       } else if (checkReachable(node2, node)) {
+                               it2 = edgeset->erase(it2);
+                               goto endinnerloop;
+                       }
+                       it2=it2->getNext();
+endinnerloop:
+                       ;
+               }
+               it=it->getNext();
+endouterloop:
+               ;
+       }
+       for(sllnode<ModelAction*> *it = edgeset->begin();it!=NULL;it=it->getNext()) {
+               ModelAction *from = it->getVal();
+               addEdge(from, to, from->get_tid() == to->get_tid());
+       }
+}
+
 /**
  * @brief Adds an edge between objects
  *