X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=cyclegraph.cc;h=1d9533f4ba9b6f2fa61ae0018bb36dc22de5abcc;hp=966a5035a9fd484074b2a6802bff58cc119e58ae;hb=25d73096cfc14c655f94b01bb235cc5efd1d5696;hpb=c87eadb9d625748d6bfc00df9195f851d791d96a diff --git a/cyclegraph.cc b/cyclegraph.cc index 966a5035..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; @@ -81,7 +80,7 @@ void CycleGraph::addNodeEdge(CycleNode *fromnode, CycleNode *tonode, bool forcee /* Propagate clock vector changes */ if (tonode->cv->merge(fromnode->cv)) { - queue->push_back(fromnode); + queue->push_back(tonode); while(!queue->empty()) { const CycleNode *node = queue->back(); queue->pop_back(); @@ -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,20 +130,21 @@ 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) { - for(SnapList::iterator it = edgeset->begin();it!=edgeset->end();) { - ModelAction *act = *it; +void CycleGraph::addEdges(SnapList * edgeset, ModelAction *to) { + for(sllnode * it = edgeset->begin();it!=NULL;) { + ModelAction *act = it->getVal(); CycleNode *node = getNode(act); - SnapList::iterator it2 = it; - it2++; - for(;it2!=edgeset->end(); ) { - ModelAction *act2 = *it2; + sllnode * it2 = it; + it2=it2->getNext(); + for(;it2!=NULL; ) { + ModelAction *act2 = it2->getVal(); CycleNode *node2 = getNode(act2); if (checkReachable(node, node2)) { it = edgeset->erase(it); @@ -153,16 +153,16 @@ void CycleGraph::addEdges(SnapList * edgeset, const ModelAction * it2 = edgeset->erase(it2); goto endinnerloop; } - it2++; + it2=it2->getNext(); endinnerloop: ; } - it++; + it=it->getNext(); endouterloop: ; } - for(SnapList::iterator it = edgeset->begin();it!=edgeset->end();it++) { - ModelAction *from = *it; + for(sllnode *it = edgeset->begin();it!=NULL;it=it->getNext()) { + ModelAction *from = it->getVal(); addEdge(from, to, from->get_tid() == to->get_tid()); } } @@ -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 */