X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=cyclegraph.cc;h=672a3986fc58b058ccfe32855ff07103a1e93266;hb=2d685f1dc9ae1f1ace850737196e6e40d2f9e326;hp=2eaec3689d51b1b9f2f40b3eb48da182ec6d6bd7;hpb=6e5c0bb2359b9fba6160957ffa88974233ba18ac;p=model-checker.git diff --git a/cyclegraph.cc b/cyclegraph.cc index 2eaec36..672a398 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,7 +163,7 @@ 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); @@ -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,7 +198,7 @@ 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< CycleNode *, ModelAlloc > queue; discovered->reset(); @@ -211,7 +222,7 @@ 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< CycleNode *, ModelAlloc > queue; discovered->reset(); @@ -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) { }