X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=cyclegraph.cc;h=2280e76e3e208b8ac6ce6e2044433c1a866d2c85;hb=c832cb55af09e735821ae3463bc37c29d3fa27c8;hp=f4d3b93314b4ad22dba40d4d56043fd5643c01d1;hpb=f4d77c40b4029cdc18f4aaa5a4e01dfbcfca5f7b;p=c11tester.git diff --git a/cyclegraph.cc b/cyclegraph.cc index f4d3b933..2280e76e 100644 --- a/cyclegraph.cc +++ b/cyclegraph.cc @@ -1,6 +1,8 @@ #include "cyclegraph.h" #include "action.h" #include "common.h" +#include "promise.h" +#include "model.h" /** Initializes a CycleGraph object. */ CycleGraph::CycleGraph() : @@ -195,6 +197,33 @@ bool CycleGraph::checkReachable(CycleNode *from, CycleNode *to) { return false; } +bool CycleGraph::checkPromise(const ModelAction *fromact, Promise *promise) { + std::vector > queue; + HashTable discovered(64); + 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;igetEdges()->size();i++) { + CycleNode *next=(*node->getEdges())[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);