X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=nodestack.cc;h=d3b7c104316161d0268c8ae1b2db7a116fbbac74;hb=a59176e8094c3a7ec272f70b7f9511f9061dd117;hp=c9878a339ec384febedaa95385e31cac478cc169;hpb=eb8e9f61a400856421465d95ac52d9cffed2a491;p=c11tester.git diff --git a/nodestack.cc b/nodestack.cc index c9878a33..d3b7c104 100644 --- a/nodestack.cc +++ b/nodestack.cc @@ -3,13 +3,31 @@ #include "common.h" #include "model.h" -/** @brief Node constructor */ -Node::Node(ModelAction *act, int nthreads) +/** + * @brief Node constructor + * + * Constructs a single Node for use in a NodeStack. Each Node is associated + * with exactly one ModelAction (exception: the first Node should be created + * as an empty stub, to represent the first thread "choice") and up to one + * parent. + * + * @param act The ModelAction to associate with this Node. May be NULL. + * @param par The parent Node in the NodeStack. May be NULL if there is no + * parent. + * @param nthreads The number of threads which exist at this point in the + * execution trace. + */ +Node::Node(ModelAction *act, Node *par, int nthreads) : action(act), + parent(par), num_threads(nthreads), explored_children(num_threads), - backtrack(num_threads) + backtrack(num_threads), + numBacktracks(0), + may_read_from() { + if (act) + act->set_node(this); } /** @brief Node desctructor */ @@ -47,22 +65,15 @@ bool Node::has_been_explored(thread_id_t tid) */ bool Node::backtrack_empty() { - unsigned int i; - for (i = 0; i < backtrack.size(); i++) - if (backtrack[i] == true) - return false; - return true; + return numBacktracks == 0; } /** - * 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 + * Mark the appropriate backtracking infromation for exploring a thread choice. + * @param act The ModelAction to explore */ void Node::explore_child(ModelAction *act) { - act->set_node(this); explore(act->get_tid()); } @@ -79,6 +90,7 @@ bool Node::set_backtrack(thread_id_t id) if (backtrack[i]) return false; backtrack[i] = true; + numBacktracks++; return true; } @@ -92,6 +104,7 @@ thread_id_t Node::get_next_backtrack() if (i >= backtrack.size()) return THREAD_ID_T_NONE; backtrack[i] = false; + numBacktracks--; return int_to_id(i); } @@ -100,10 +113,22 @@ bool Node::is_enabled(Thread *t) return id_to_int(t->get_id()) < num_threads; } +/** + * Add an action to the may_read_from set. + * @param act is the action to add + */ +void Node::add_read_from(ModelAction *act) +{ + may_read_from.insert(act); +} + void Node::explore(thread_id_t tid) { int i = id_to_int(tid); - backtrack[i] = false; + if (backtrack[i]) { + backtrack[i] = false; + numBacktracks--; + } explored_children[i] = true; } @@ -161,7 +186,7 @@ ModelAction * NodeStack::explore_action(ModelAction *act) /* Record action */ get_head()->explore_child(act); - node_list.push_back(new Node(act, model->get_num_threads())); + node_list.push_back(new Node(act, get_head(), model->get_num_threads())); total_nodes++; iter++; return NULL;