-void CycleGraph::startChanges() {
- ASSERT(rollbackvector.size()==0);
- ASSERT(rmwrollbackvector.size()==0);
- ASSERT(oldCycles==hasCycles);
- ASSERT(oldRMWViolation==hasRMWViolation);
+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->increment_threads(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.size() == 0);
+ ASSERT(rmwrollbackvector.size() == 0);
+ ASSERT(oldCycles == hasCycles);
+ ASSERT(oldRMWViolation == hasRMWViolation);