X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=cyclegraph.cc;h=3949b6ec86d885056282a0b84d0975267da13cdd;hb=d70f6f259c9850e5fceb527e3a9541c440c0146b;hp=51066c94601fef25bf99e021a91183b66719ad08;hpb=fc32611957cecd106751b62bc4de4aeddc9af56c;p=model-checker.git diff --git a/cyclegraph.cc b/cyclegraph.cc index 51066c9..3949b6e 100644 --- a/cyclegraph.cc +++ b/cyclegraph.cc @@ -17,6 +17,20 @@ CycleGraph::CycleGraph() : /** CycleGraph destructor */ CycleGraph::~CycleGraph() { + delete discovered; +} + +/** + * Add a CycleNode to the graph, corresponding to a store ModelAction + * @param act The write action that should be added + * @param node The CycleNode that corresponds to the store + */ +void CycleGraph::putNode(const ModelAction *act, CycleNode *node) +{ + actionToNode.put(act, node); +#if SUPPORT_MOD_ORDER_DUMP + nodeList.push_back(node); +#endif } /** @@ -29,10 +43,7 @@ CycleNode * CycleGraph::getNode(const ModelAction *action) CycleNode *node = actionToNode.get(action); if (node == NULL) { node = new CycleNode(action); - actionToNode.put(action, node); -#if SUPPORT_MOD_ORDER_DUMP - nodeList.push_back(node); -#endif + putNode(action, node); } return node; } @@ -135,12 +146,12 @@ void CycleGraph::addRMWEdge(const ModelAction *from, const ModelAction *rmw) } #if SUPPORT_MOD_ORDER_DUMP -void CycleGraph::dumpNodes(FILE *file) +void CycleGraph::dumpNodes(FILE *file) const { for (unsigned int i = 0; i < nodeList.size(); i++) { CycleNode *cn = nodeList[i]; const ModelAction *action = cn->getAction(); - fprintf(file, "N%u [label=\"%u, T%u\"];\n",action->get_seq_number(),action->get_seq_number(), action->get_tid()); + fprintf(file, "N%u [label=\"%u, T%u\"];\n", action->get_seq_number(), action->get_seq_number(), action->get_tid()); if (cn->getRMW() != NULL) { fprintf(file, "N%u -> N%u[style=dotted];\n", action->get_seq_number(), cn->getRMW()->getAction()->get_seq_number()); } @@ -152,15 +163,15 @@ void CycleGraph::dumpNodes(FILE *file) } } -void CycleGraph::dumpGraphToFile(const char *filename) +void CycleGraph::dumpGraphToFile(const char *filename) const { char buffer[200]; - sprintf(buffer, "%s.dot",filename); + sprintf(buffer, "%s.dot", filename); FILE *file = fopen(buffer, "w"); - fprintf(file, "digraph %s {\n",filename); + fprintf(file, "digraph %s {\n", filename); dumpNodes(file); - fprintf(file,"}\n"); - fclose(file); + fprintf(file, "}\n"); + fclose(file); } #endif @@ -170,7 +181,7 @@ void CycleGraph::dumpGraphToFile(const char *filename) * @param to The ModelAction to reach * @return True, @a from can reach @a to; otherwise, false */ -bool CycleGraph::checkReachable(const ModelAction *from, const ModelAction *to) +bool CycleGraph::checkReachable(const ModelAction *from, const ModelAction *to) const { CycleNode *fromnode = actionToNode.get(from); CycleNode *tonode = actionToNode.get(to); @@ -187,9 +198,9 @@ bool CycleGraph::checkReachable(const ModelAction *from, const ModelAction *to) * @param to The CycleNode to reach * @return True, @a from can reach @a to; otherwise, false */ -bool CycleGraph::checkReachable(CycleNode *from, CycleNode *to) +bool CycleGraph::checkReachable(CycleNode *from, CycleNode *to) const { - std::vector > queue; + std::vector< CycleNode *, ModelAlloc > queue; discovered->reset(); queue.push_back(from); @@ -203,7 +214,7 @@ bool CycleGraph::checkReachable(CycleNode *from, CycleNode *to) for (unsigned int i = 0; i < node->getNumEdges(); i++) { CycleNode *next = node->getEdge(i); if (!discovered->contains(next)) { - discovered->put(next,next); + discovered->put(next, next); queue.push_back(next); } } @@ -211,9 +222,9 @@ bool CycleGraph::checkReachable(CycleNode *from, CycleNode *to) return false; } -bool CycleGraph::checkPromise(const ModelAction *fromact, Promise *promise) +bool CycleGraph::checkPromise(const ModelAction *fromact, Promise *promise) const { - std::vector > queue; + std::vector< CycleNode *, ModelAlloc > queue; discovered->reset(); CycleNode *from = actionToNode.get(fromact); @@ -230,7 +241,7 @@ bool CycleGraph::checkPromise(const ModelAction *fromact, Promise *promise) for (unsigned int i = 0; i < node->getNumEdges(); i++) { CycleNode *next = node->getEdge(i); if (!discovered->contains(next)) { - discovered->put(next,next); + discovered->put(next, next); queue.push_back(next); } } @@ -256,7 +267,8 @@ void CycleGraph::commitChanges() } /** Rollback changes to the previous commit. */ -void CycleGraph::rollbackChanges() { +void CycleGraph::rollbackChanges() +{ for (unsigned int i = 0; i < rollbackvector.size(); i++) { rollbackvector[i]->popEdge(); } @@ -272,20 +284,22 @@ void CycleGraph::rollbackChanges() { } /** @returns whether a CycleGraph contains cycles. */ -bool CycleGraph::checkForCycles() { +bool CycleGraph::checkForCycles() const +{ return hasCycles; } -bool CycleGraph::checkForRMWViolation() { +bool CycleGraph::checkForRMWViolation() const +{ return hasRMWViolation; } /** - * Constructor for a CycleNode. - * @param modelaction The ModelAction for this node + * @brief Constructor for a CycleNode + * @param act The ModelAction for this node */ -CycleNode::CycleNode(const ModelAction *modelaction) : - action(modelaction), +CycleNode::CycleNode(const ModelAction *act) : + action(act), hasRMW(NULL) { } @@ -305,6 +319,16 @@ unsigned int CycleNode::getNumEdges() const return edges.size(); } +CycleNode * CycleNode::getBackEdge(unsigned int i) const +{ + return back_edges[i]; +} + +unsigned int CycleNode::getNumBackEdges() const +{ + return back_edges.size(); +} + /** * Adds an edge from this CycleNode to another CycleNode. * @param node The node to which we add a directed edge @@ -315,6 +339,7 @@ bool CycleNode::addEdge(CycleNode *node) if (edges[i] == node) return false; edges.push_back(node); + node->back_edges.push_back(this); return true; }