X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=nodestack.cc;h=69f0b5f513640f5861c6c3bf117c73fc440c7da6;hb=160c85908774dfffc19dc1b02f4f845a14c056af;hp=6eb71dc89c8f15097514781ed95209304414d1f6;hpb=6ec6d90066682d8849af174e531e4e0d547ebab3;p=c11tester.git diff --git a/nodestack.cc b/nodestack.cc index 6eb71dc8..69f0b5f5 100644 --- a/nodestack.cc +++ b/nodestack.cc @@ -17,7 +17,7 @@ * @param nthreads The number of threads which exist at this point in the * execution trace. */ -Node::Node(ModelAction *act, Node *par, int nthreads) +Node::Node(ModelAction *act, Node *par, int nthreads, bool *enabled) : action(act), parent(par), num_threads(nthreads), @@ -27,10 +27,16 @@ Node::Node(ModelAction *act, Node *par, int nthreads) may_read_from(), read_from_index(0), future_values(), - future_index(0) + future_index(-1) { if (act) act->set_node(this); + enabled_array=(bool *)MYMALLOC(sizeof(bool)*num_threads); + if (enabled) + memcpy(enabled_array, enabled, sizeof(bool)*num_threads); + else + for(int i=0;iprint(); + for (unsigned int i = 0; i < may_read_from.size(); i++) + may_read_from[i]->print(); } -void Node::set_promise(uint32_t i) { - if (i>=promises.size()) - promises.resize(i+1,0); - promises[i]=1; +/** + * Sets a promise to explore meeting with the given node. + * @param i is the promise index. + */ +void Node::set_promise(unsigned int i) { + if (i >= promises.size()) + promises.resize(i + 1, PROMISE_IGNORE); + if (promises[i] == PROMISE_IGNORE) + promises[i] = PROMISE_UNFULFILLED; } -bool Node::get_promise(uint32_t i) { - return (promises[i]==2); +/** + * Looks up whether a given promise should be satisfied by this node. + * @param i The promise index. + * @return true if the promise should be satisfied by the given model action. + */ +bool Node::get_promise(unsigned int i) { + return (i < promises.size()) && (promises[i] == PROMISE_FULFILLED); } -bool Node::increment_promises() { - for (unsigned int i=0;i 0) { i--; - if (promises[i]==2) - promises[i]=1; - } while(i>0); + if (promises[i] == PROMISE_FULFILLED) + promises[i] = PROMISE_UNFULFILLED; + } return true; } } return false; } -bool Node::promises_empty() { - for (unsigned int i=0;i=expiration) + return false; + if (future_index < i) { + suitableindex=i; + } + } + } -bool Node::add_future_value(uint64_t value) { - for(unsigned int i=0;i=future_values.size()); +bool Node::future_value_empty() { + return ((future_index + 1) >= future_values.size()); } - /** * Checks if the Thread associated with this thread ID has been explored from * this Node already. @@ -134,17 +168,14 @@ bool Node::backtrack_empty() return (numBacktracks == 0); } - /** * Checks whether the readsfrom set for this node is empty. * @return true if the readsfrom set is empty. */ -bool Node::readsfrom_empty() { - return ((read_from_index+1)>=may_read_from.size()); +bool Node::read_from_empty() { + return ((read_from_index+1) >= may_read_from.size()); } - - /** * Mark the appropriate backtracking information for exploring a thread choice. * @param act The ModelAction to explore @@ -188,7 +219,8 @@ thread_id_t Node::get_next_backtrack() bool Node::is_enabled(Thread *t) { - return id_to_int(t->get_id()) < num_threads; + int thread_id=id_to_int(t->get_id()); + return thread_id < num_threads && enabled_array[thread_id]; } /** @@ -205,21 +237,32 @@ void Node::add_read_from(const ModelAction *act) * where this->action is a 'read'. * @return The first element in future_values */ - uint64_t Node::get_future_value() { ASSERT(future_indexaction is a 'read'. - * @todo Perform reads_from backtracking/replay properly, so that this function - * may remove elements from may_read_from * @return The first element in may_read_from */ const ModelAction * Node::get_read_from() { - if (read_from_indexexplore_child(act); - node_list.push_back(new Node(act, get_head(), model->get_num_threads())); + node_list.push_back(new Node(act, get_head(), model->get_num_threads(), enabled)); total_nodes++; iter++; return NULL;