Merge branch 'branch-weiyu' of ssh://plrg.eecs.uci.edu:/home/git/random-fuzzer into...
[c11tester.git] / cyclegraph.cc
index 5d894f848d474444d4c482ae214e7f384a58be5d..79030985e6b45e5a3555c4d66ef5a4bbea40dd44 100644 (file)
@@ -81,7 +81,7 @@ void CycleGraph::addNodeEdge(CycleNode *fromnode, CycleNode *tonode, bool forcee
 
        /* Propagate clock vector changes */
        if (tonode->cv->merge(fromnode->cv)) {
-               queue->push_back(fromnode);
+               queue->push_back(tonode);
                while(!queue->empty()) {
                        const CycleNode *node = queue->back();
                        queue->pop_back();
@@ -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
  *