X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=cyclegraph.cc;h=e56c91285d36dd4d78374fafe9fd313ee46be0d6;hb=c0e05b3952fa7190116fdc1df124bc6fa5804027;hp=5d894f848d474444d4c482ae214e7f384a58be5d;hpb=63b2c687570085f2a87b6a659d26608228af1ee0;p=c11tester.git diff --git a/cyclegraph.cc b/cyclegraph.cc index 5d894f84..e56c9128 100644 --- a/cyclegraph.cc +++ b/cyclegraph.cc @@ -133,10 +133,40 @@ void CycleGraph::addRMWEdge(const ModelAction *from, const ModelAction *rmw) } } fromnode->edges.clear(); - + addNodeEdge(fromnode, rmwnode, true); } +void CycleGraph::addEdges(SnapList * edgeset, const ModelAction *to) { + for(sllnode * it = edgeset->begin();it!=NULL;) { + ModelAction *act = it->getVal(); + CycleNode *node = getNode(act); + sllnode * 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 *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 *