X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=cyclegraph.cc;h=eaddc8e1714629f8834a5b11c891f8009b2e1237;hb=00b14c0561d3838aeb798d3c22f4136f8c4d136b;hp=d2a032efde0a2124c6ea5744603d52d27c23c3e1;hpb=ff29187c639cdb032debdb036d2c9062f77879b0;p=model-checker.git diff --git a/cyclegraph.cc b/cyclegraph.cc index d2a032e..eaddc8e 100644 --- a/cyclegraph.cc +++ b/cyclegraph.cc @@ -168,13 +168,16 @@ bool CycleGraph::mergeNodes(CycleNode *w_node, CycleNode *p_node, * Adds an edge between two CycleNodes. * @param fromnode The edge comes from this CycleNode * @param tonode The edge points to this CycleNode + * @return True, if new edge(s) are added; otherwise false */ -void CycleGraph::addNodeEdge(CycleNode *fromnode, CycleNode *tonode) +bool CycleGraph::addNodeEdge(CycleNode *fromnode, CycleNode *tonode) { + bool added; + if (!hasCycles) hasCycles = checkReachable(tonode, fromnode); - if (fromnode->addEdge(tonode)) + if ((added = fromnode->addEdge(tonode))) rollbackvector.push_back(fromnode); /* @@ -186,9 +189,12 @@ void CycleGraph::addNodeEdge(CycleNode *fromnode, CycleNode *tonode) if (!hasCycles) hasCycles = checkReachable(tonode, rmwnode); - if (rmwnode->addEdge(tonode)) + if (rmwnode->addEdge(tonode)) { rollbackvector.push_back(rmwnode); + added = true; + } } + return added; } /** @@ -295,6 +301,7 @@ bool CycleGraph::checkReachable(const CycleNode *from, const CycleNode *to) cons return false; } +/** @return True, if the promise has failed; false otherwise */ bool CycleGraph::checkPromise(const ModelAction *fromact, Promise *promise) const { std::vector< CycleNode *, ModelAlloc > queue; @@ -307,9 +314,9 @@ bool CycleGraph::checkPromise(const ModelAction *fromact, Promise *promise) cons CycleNode *node = queue.back(); queue.pop_back(); - if (promise->eliminate_thread(node->getAction()->get_tid())) { + if (!node->is_promise() && + promise->eliminate_thread(node->getAction()->get_tid())) return true; - } for (unsigned int i = 0; i < node->getNumEdges(); i++) { CycleNode *next = node->getEdge(i);