void ModelChecker::add_future_value(const ModelAction *writer, ModelAction *reader)
{
/* Do more ambitious checks now that mo is more complete */
- if (mo_may_allow(writer, reader) &&
- reader->get_node()->add_future_value(writer,
- writer->get_seq_number() + params.maxfuturedelay))
- set_latest_backtrack(reader);
+ if (mo_may_allow(writer, reader)) {
+ struct future_value fv = {
+ writer->get_value(),
+ writer->get_seq_number() + params.maxfuturedelay,
+ };
+ if (reader->get_node()->add_future_value(fv))
+ set_latest_backtrack(reader);
+ }
}
/**
* @param value is the value to backtrack to.
* @return True if the future value was successully added; false otherwise
*/
-bool Node::add_future_value(const ModelAction *writer, modelclock_t expiration)
+bool Node::add_future_value(struct future_value& fv)
{
- uint64_t value = writer->get_value();
+ uint64_t value = fv.value;
+ modelclock_t expiration = fv.expiration;
int idx = -1; /* Highest index where value is found */
for (unsigned int i = 0; i < future_values.size(); i++) {
if (future_values[i].value == value) {
(int)future_values.size() >= model->params.maxfuturevalues)
return false;
- struct future_value newfv = {value, expiration};
- future_values.push_back(newfv);
+ future_values.push_back(fv);
return true;
}
* occurred previously in the stack. */
Node * get_parent() const { return parent; }
- bool add_future_value(const ModelAction *writer, modelclock_t expiration);
+ bool add_future_value(struct future_value& fv);
struct future_value get_future_value() const;
bool increment_future_value();
bool future_value_empty() const;