X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=cyclegraph.h;h=749abf8ca847d9969016356101b153c4d0688a84;hb=00b14c0561d3838aeb798d3c22f4136f8c4d136b;hp=9fc789c1913edd590f59c497f6cee1ff0b59eff2;hpb=096afcb50341ae3e0b8fccb4ee06881086bc0953;p=model-checker.git diff --git a/cyclegraph.h b/cyclegraph.h index 9fc789c..749abf8 100644 --- a/cyclegraph.h +++ b/cyclegraph.h @@ -28,7 +28,7 @@ class CycleGraph { ~CycleGraph(); template - void addEdge(const T from, const U to); + bool addEdge(const T from, const U to); bool checkForCycles() const; void addRMWEdge(const ModelAction *from, const ModelAction *rmw); @@ -50,7 +50,7 @@ class CycleGraph { SNAPSHOTALLOC private: - void addNodeEdge(CycleNode *fromnode, CycleNode *tonode); + bool addNodeEdge(CycleNode *fromnode, CycleNode *tonode); void putNode(const ModelAction *act, CycleNode *node); CycleNode * getNode(const ModelAction *act); CycleNode * getNode(const Promise *promise); @@ -141,9 +141,10 @@ class CycleNode { * * @param to The edge points to this object, of type T * @param from The edge comes from this object, of type U + * @return True, if new edge(s) are added; otherwise false */ template -void CycleGraph::addEdge(const T from, const U to) +bool CycleGraph::addEdge(const T from, const U to) { ASSERT(from); ASSERT(to); @@ -151,7 +152,25 @@ void CycleGraph::addEdge(const T from, const U to) CycleNode *fromnode = getNode(from); CycleNode *tonode = getNode(to); - addNodeEdge(fromnode, tonode); + return addNodeEdge(fromnode, tonode); +} + +/** + * Checks whether one ModelAction can reach another ModelAction/Promise + * @param from The ModelAction from which to begin exploration + * @param to The ModelAction or Promise to reach + * @return True, @a from can reach @a to; otherwise, false + */ +template +bool CycleGraph::checkReachable(const ModelAction *from, const T *to) const +{ + CycleNode *fromnode = getNode_noCreate(from); + CycleNode *tonode = getNode_noCreate(to); + + if (!fromnode || !tonode) + return false; + + return checkReachable(fromnode, tonode); } #endif /* __CYCLEGRAPH_H__ */