From: Brian Norris Date: Sat, 2 Mar 2013 23:13:42 +0000 (-0800) Subject: action: add get_return_value() X-Git-Url: http://plrg.eecs.uci.edu/git/?p=cdsspec-compiler.git;a=commitdiff_plain;h=c1db87fb3d52c93feb22496fe1e8513e35320c3d action: add get_return_value() This return value is useful for both printing (debugging) and the model-checker process_read() function. --- diff --git a/action.cc b/action.cc index 893c812..1007e76 100644 --- a/action.cc +++ b/action.cc @@ -416,6 +416,26 @@ uint64_t ModelAction::get_write_value() const return value; } +/** + * @brief Get the value returned by this action + * + * For atomic reads (including RMW), an operation returns the value it read. + * For atomic writes, an operation returns the value it wrote. For other + * operations, the return value varies (sometimes is a "don't care"), but the + * value is simply stored in the "value" field. + * + * @return This action's return value + */ +uint64_t ModelAction::get_return_value() const +{ + if (is_read()) + return get_reads_from_value(); + else if (is_write()) + return get_write_value(); + else + return value; +} + /** @return The Node associated with this ModelAction */ Node * ModelAction::get_node() const { @@ -548,14 +568,6 @@ void ModelAction::print() const type_str = "unknown type"; } - uint64_t valuetoprint; - if (is_read()) - valuetoprint = get_reads_from_value(); - else if (is_write()) - valuetoprint = get_write_value(); - else - valuetoprint = value; - switch (this->order) { case std::memory_order_relaxed: mo_str = "relaxed"; @@ -578,7 +590,7 @@ void ModelAction::print() const } model_print("(%4d) Thread: %-2d Action: %-13s MO: %7s Loc: %14p Value: %-#18" PRIx64, - seq_number, id_to_int(tid), type_str, mo_str, location, valuetoprint); + seq_number, id_to_int(tid), type_str, mo_str, location, get_return_value()); if (is_read()) { if (reads_from) model_print(" Rf: %-3d", reads_from->get_seq_number()); diff --git a/action.h b/action.h index 7c9146f..1b03bc4 100644 --- a/action.h +++ b/action.h @@ -82,6 +82,7 @@ public: uint64_t get_value() const { return value; } uint64_t get_reads_from_value() const; uint64_t get_write_value() const; + uint64_t get_return_value() const; const ModelAction * get_reads_from() const { return reads_from; } Promise * get_reads_from_promise() const { return reads_from_promise; } diff --git a/model.cc b/model.cc index 4fca7aa..86289a0 100644 --- a/model.cc +++ b/model.cc @@ -853,7 +853,6 @@ ModelAction * ModelChecker::get_next_backtrack() bool ModelChecker::process_read(ModelAction *curr) { Node *node = curr->get_node(); - uint64_t value = VALUE_NONE; while (true) { bool updated = false; switch (node->get_read_from_status()) { @@ -874,7 +873,6 @@ bool ModelChecker::process_read(ModelAction *curr) } updated = r_modification_order(curr, rf); - value = rf->get_write_value(); read_from(curr, rf); mo_graph->commitChanges(); mo_check_promises(curr, true); @@ -884,7 +882,6 @@ bool ModelChecker::process_read(ModelAction *curr) Promise *promise = curr->get_node()->get_read_from_promise(); if (promise->add_reader(curr)) priv->failed_promise = true; - value = promise->get_value(); curr->set_read_from_promise(promise); mo_graph->startChanges(); if (!check_recency(curr, promise)) @@ -897,7 +894,6 @@ bool ModelChecker::process_read(ModelAction *curr) /* Read from future value */ struct future_value fv = node->get_future_value(); Promise *promise = new Promise(curr, fv); - value = fv.value; curr->set_read_from_promise(promise); promises->push_back(promise); mo_graph->startChanges(); @@ -908,7 +904,7 @@ bool ModelChecker::process_read(ModelAction *curr) default: ASSERT(false); } - get_thread(curr)->set_return_value(value); + get_thread(curr)->set_return_value(curr->get_return_value()); return updated; } }