X-Git-Url: http://plrg.eecs.uci.edu/git/?p=model-checker.git;a=blobdiff_plain;f=nodestack.cc;h=e342456c7bc74d856d3844f1aad5bc1d11acb5c1;hp=4cbd7cea820fa6ce7e4764a8fd758d87621d3ec2;hb=d6df701e914b99ba0ca51706a66ab46e138137b6;hpb=badfcf21c3b782bee736e936132e3c6873859053 diff --git a/nodestack.cc b/nodestack.cc index 4cbd7ce..e342456 100644 --- a/nodestack.cc +++ b/nodestack.cc @@ -1,29 +1,25 @@ #include "nodestack.h" #include "action.h" #include "common.h" +#include "model.h" -int Node::total_nodes = 0; - -Node::Node(ModelAction *act, Node *parent) +/** @brief Node constructor */ +Node::Node(ModelAction *act, int nthreads) : action(act), - num_threads(parent ? parent->num_threads : 1), + num_threads(nthreads), explored_children(num_threads), backtrack(num_threads) { - total_nodes++; - if (act && act->get_type() == THREAD_CREATE) { - num_threads++; - explored_children.resize(num_threads); - backtrack.resize(num_threads); - } } +/** @brief Node desctructor */ Node::~Node() { if (action) delete action; } +/** Prints debugging info for the ModelAction associated with this Node */ void Node::print() { if (action) @@ -32,12 +28,23 @@ void Node::print() printf("******** empty action ********\n"); } +/** + * Checks if the Thread associated with this thread ID has been explored from + * this Node already. + * @param tid is the thread ID to check + * @return true if this thread choice has been explored already, false + * otherwise + */ bool Node::has_been_explored(thread_id_t tid) { int id = id_to_int(tid); return explored_children[id]; } +/** + * Checks if the backtracking set is empty. + * @return true if the backtracking set is empty + */ bool Node::backtrack_empty() { unsigned int i; @@ -47,12 +54,25 @@ bool Node::backtrack_empty() return true; } +/** + * Explore a child Node using a given ModelAction. This updates both the + * Node-internal and the ModelAction data to associate the ModelAction with + * this Node. + * @param act is the ModelAction to explore + */ void Node::explore_child(ModelAction *act) { act->set_node(this); explore(act->get_tid()); } +/** + * Records a backtracking reference for a thread choice within this Node. + * Provides feedback as to whether this thread choice is already set for + * backtracking. + * @return false if the thread was already set to be backtracked, true + * otherwise + */ bool Node::set_backtrack(thread_id_t id) { int i = id_to_int(id); @@ -98,8 +118,10 @@ static void clear_node_list(node_list_t *list, node_list_t::iterator start, } NodeStack::NodeStack() + : total_nodes(0) { node_list.push_back(new Node()); + total_nodes++; iter = node_list.begin(); } @@ -139,8 +161,8 @@ ModelAction * NodeStack::explore_action(ModelAction *act) /* Record action */ get_head()->explore_child(act); - act->create_cv(get_head()->get_action()); - node_list.push_back(new Node(act, get_head())); + node_list.push_back(new Node(act, model->get_num_threads())); + total_nodes++; iter++; } return (*iter)->get_action();