+bool CycleGraph::checkPromise(const ModelAction *fromact, Promise *promise) const
+{
+ std::vector< CycleNode *, ModelAlloc<CycleNode *> > queue;
+ discovered->reset();
+ CycleNode *from = actionToNode.get(fromact);
+
+ queue.push_back(from);
+ discovered->put(from, from);
+ while (!queue.empty()) {
+ CycleNode *node = queue.back();
+ queue.pop_back();
+
+ if (promise->eliminate_thread(node->getAction()->get_tid())) {
+ return true;
+ }
+
+ for (unsigned int i = 0; i < node->getNumEdges(); i++) {
+ CycleNode *next = node->getEdge(i);
+ if (!discovered->contains(next)) {
+ discovered->put(next, next);
+ queue.push_back(next);
+ }
+ }
+ }
+ return false;
+}
+
+void CycleGraph::startChanges()
+{
+ ASSERT(rollbackvector.empty());
+ ASSERT(rmwrollbackvector.empty());
+ ASSERT(oldCycles == hasCycles);
+}
+
+/** Commit changes to the cyclegraph. */
+void CycleGraph::commitChanges()
+{
+ rollbackvector.clear();
+ rmwrollbackvector.clear();
+ oldCycles = hasCycles;
+}
+
+/** Rollback changes to the previous commit. */
+void CycleGraph::rollbackChanges()
+{
+ for (unsigned int i = 0; i < rollbackvector.size(); i++)
+ rollbackvector[i]->popEdge();
+
+ for (unsigned int i = 0; i < rmwrollbackvector.size(); i++)
+ rmwrollbackvector[i]->clearRMW();
+
+ hasCycles = oldCycles;
+ rollbackvector.clear();
+ rmwrollbackvector.clear();
+}
+