X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=nodestack.cc;h=2ebfc718a3c89403fb19fff42390d11d284ad789;hb=88ccfdff63126a0fa70c094c7ed7e66f68e1b861;hp=6eb71dc89c8f15097514781ed95209304414d1f6;hpb=6ec6d90066682d8849af174e531e4e0d547ebab3;p=model-checker.git diff --git a/nodestack.cc b/nodestack.cc index 6eb71dc..2ebfc71 100644 --- a/nodestack.cc +++ b/nodestack.cc @@ -27,7 +27,7 @@ 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); @@ -52,39 +52,55 @@ void Node::print() /** @brief Prints info about may_read_from set */ void Node::print_may_read_from() { - readfrom_set_t::iterator it; - for (it = may_read_from.begin(); it != may_read_from.end(); it++) - (*it)->print(); + 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); + 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=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 +148,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 @@ -205,7 +216,6 @@ 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_index