* 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);
/*
if (!hasCycles)
hasCycles = checkReachable(tonode, rmwnode);
- if (rmwnode->addEdge(tonode))
+ if (rmwnode->addEdge(tonode)) {
rollbackvector.push_back(rmwnode);
+ added = true;
+ }
}
+ return added;
}
/**
return false;
}
+/** @return True, if the promise has failed; false otherwise */
bool CycleGraph::checkPromise(const ModelAction *fromact, Promise *promise) const
{
std::vector< CycleNode *, ModelAlloc<CycleNode *> > queue;
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);
void CycleGraph::rollbackChanges()
{
for (unsigned int i = 0; i < rollbackvector.size(); i++)
- rollbackvector[i]->popEdge();
+ rollbackvector[i]->removeEdge();
for (unsigned int i = 0; i < rmwrollbackvector.size(); i++)
rmwrollbackvector[i]->clearRMW();