X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=nodestack.cc;h=431baafbdce9809a2cb49ebcea30837182c852cf;hb=1bc8782b55cab0503f1b64529f993f0b9e3a1846;hp=a9399edbe9a35cd28328e438a8ce6e23c8cebeb3;hpb=fa47e498d6eb6a97d25bc255df1c08bf66bc4c40;p=c11tester.git diff --git a/nodestack.cc b/nodestack.cc index a9399edb..431baafb 100644 --- a/nodestack.cc +++ b/nodestack.cc @@ -63,7 +63,8 @@ void Node::print_may_read_from() void Node::set_promise(unsigned int i) { if (i >= promises.size()) promises.resize(i + 1, PROMISE_IGNORE); - promises[i] = PROMISE_UNFULFILLED; + if (promises[i] == PROMISE_IGNORE) + promises[i] = PROMISE_UNFULFILLED; } /** @@ -109,12 +110,24 @@ bool Node::promise_empty() { * Adds a value from a weakly ordered future write to backtrack to. * @param value is the value to backtrack to. */ -bool Node::add_future_value(uint64_t value) { - for (unsigned int i = 0; i < future_values.size(); i++) - if (future_values[i] == value) - return false; +bool Node::add_future_value(uint64_t value, modelclock_t expiration) { + int suitableindex=-1; + for (unsigned int i = 0; i < future_values.size(); i++) { + if (future_values[i].value == value) { + if (future_values[i].expiration>=expiration) + return false; + if (future_index < i) { + suitableindex=i; + } + } + } - future_values.push_back(value); + if (suitableindex!=-1) { + future_values[suitableindex].expiration=expiration; + return true; + } + struct future_value newfv={value, expiration}; + future_values.push_back(newfv); return true; } @@ -218,9 +231,15 @@ void Node::add_read_from(const ModelAction *act) */ uint64_t Node::get_future_value() { ASSERT(future_index