X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=cyclegraph.cc;h=1d9533f4ba9b6f2fa61ae0018bb36dc22de5abcc;hp=79030985e6b45e5a3555c4d66ef5a4bbea40dd44;hb=25d73096cfc14c655f94b01bb235cc5efd1d5696;hpb=cb94be05c3b0f333821bf9fdd840dea82cba4ed8 diff --git a/cyclegraph.cc b/cyclegraph.cc index 79030985..1d9533f4 100644 --- a/cyclegraph.cc +++ b/cyclegraph.cc @@ -43,7 +43,7 @@ CycleNode * CycleGraph::getNode_noCreate(const ModelAction *act) const * @param action The ModelAction to find a node for * @return The CycleNode paired with this action */ -CycleNode * CycleGraph::getNode(const ModelAction *action) +CycleNode * CycleGraph::getNode(ModelAction *action) { CycleNode *node = getNode_noCreate(action); if (node == NULL) { @@ -70,8 +70,7 @@ void CycleGraph::addNodeEdge(CycleNode *fromnode, CycleNode *tonode, bool forcee * If the fromnode has a rmwnode, we should * follow its RMW chain to add an edge at the end. */ - while (fromnode->getRMW()) { - CycleNode *nextnode = fromnode->getRMW(); + while (CycleNode * nextnode = fromnode->getRMW()) { if (nextnode == tonode) break; fromnode = nextnode; @@ -107,7 +106,7 @@ void CycleGraph::addNodeEdge(CycleNode *fromnode, CycleNode *tonode, bool forcee * @param rmw The edge points to this ModelAction; this action must read from * the ModelAction from */ -void CycleGraph::addRMWEdge(const ModelAction *from, const ModelAction *rmw) +void CycleGraph::addRMWEdge(ModelAction *from, ModelAction *rmw) { ASSERT(from); ASSERT(rmw); @@ -131,13 +130,14 @@ void CycleGraph::addRMWEdge(const ModelAction *from, const ModelAction *rmw) if (tonode != rmwnode) { rmwnode->addEdge(tonode); } + tonode->removeInEdge(fromnode); } fromnode->edges.clear(); addNodeEdge(fromnode, rmwnode, true); } -void CycleGraph::addEdges(SnapList * edgeset, const ModelAction *to) { +void CycleGraph::addEdges(SnapList * edgeset, ModelAction *to) { for(sllnode * it = edgeset->begin();it!=NULL;) { ModelAction *act = it->getVal(); CycleNode *node = getNode(act); @@ -181,7 +181,7 @@ endouterloop: * @return True, if new edge(s) are added; otherwise false */ -void CycleGraph::addEdge(const ModelAction *from, const ModelAction *to) +void CycleGraph::addEdge(ModelAction *from, ModelAction *to) { ASSERT(from); ASSERT(to); @@ -192,7 +192,7 @@ void CycleGraph::addEdge(const ModelAction *from, const ModelAction *to) addNodeEdge(fromnode, tonode, false); } -void CycleGraph::addEdge(const ModelAction *from, const ModelAction *to, bool forceedge) +void CycleGraph::addEdge(ModelAction *from, ModelAction *to, bool forceedge) { ASSERT(from); ASSERT(to); @@ -290,17 +290,54 @@ bool CycleGraph::checkReachable(const ModelAction *from, const ModelAction *to) return checkReachable(fromnode, tonode); } +void CycleGraph::freeAction(const ModelAction * act) { + CycleNode *cn = actionToNode.remove(act); + for(unsigned int i=0;iedges.size();i++) { + CycleNode *dst = cn->edges[i]; + dst->removeInEdge(cn); + } + for(unsigned int i=0;iinedges.size();i++) { + CycleNode *src = cn->inedges[i]; + src->removeEdge(cn); + } + delete cn; +} + /** * @brief Constructor for a CycleNode * @param act The ModelAction for this node */ -CycleNode::CycleNode(const ModelAction *act) : +CycleNode::CycleNode(ModelAction *act) : action(act), hasRMW(NULL), cv(new ClockVector(NULL, act)) { } +CycleNode::~CycleNode() { + delete cv; +} + +void CycleNode::removeInEdge(CycleNode *src) { + for(unsigned int i=0;i < inedges.size();i++) { + if (inedges[i] == src) { + inedges[i] = inedges[inedges.size()-1]; + inedges.pop_back(); + break; + } + } +} + +void CycleNode::removeEdge(CycleNode *dst) { + for(unsigned int i=0;i < edges.size();i++) { + if (edges[i] == dst) { + edges[i] = edges[edges.size()-1]; + edges.pop_back(); + break; + } + } +} + /** * @param i The index of the edge to return * @returns The CycleNode edge indexed by i @@ -317,17 +354,18 @@ unsigned int CycleNode::getNumEdges() const } /** - * @brief Remove a (forward) edge from this CycleNode - * @return The CycleNode which was popped, if one exists; otherwise NULL + * @param i The index of the edge to return + * @returns The CycleNode edge indexed by i */ -CycleNode * CycleNode::removeEdge() +CycleNode * CycleNode::getInEdge(unsigned int i) const { - if (edges.empty()) - return NULL; + return inedges[i]; +} - CycleNode *ret = edges.back(); - edges.pop_back(); - return ret; +/** @returns The number of edges leaving this CycleNode */ +unsigned int CycleNode::getNumInEdges() const +{ + return inedges.size(); } /** @@ -341,6 +379,7 @@ void CycleNode::addEdge(CycleNode *node) if (edges[i] == node) return; edges.push_back(node); + node->inedges.push_back(this); } /** @returns the RMW CycleNode that reads from the current CycleNode */