X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=action.cc;h=757b3d1d2fcc53bf1ed86a711785a84f808d1883;hb=c4c6c997cb5d2d651d4dfa76390a42592432d266;hp=81f447a5b13f9d8e3db3e352e4be49f4659559b0;hpb=f5029d07e4fad5921f60108f5632fb2a5e4a52fb;p=model-checker.git diff --git a/action.cc b/action.cc index 81f447a..757b3d1 100644 --- a/action.cc +++ b/action.cc @@ -378,6 +378,44 @@ void ModelAction::set_try_lock(bool obtainedlock) { value = VALUE_TRYFAILED; } +/** + * @brief Get the value read by this load + * + * We differentiate this function from ModelAction::get_write_value and + * ModelAction::get_value for the purpose of RMW's, which may have both a + * 'read' and a 'write' value. + * + * Note: 'this' must be a load. + * + * @return The value read by this load + */ +uint64_t ModelAction::get_reads_from_value() const +{ + ASSERT(is_read()); + if (reads_from) + return reads_from->get_write_value(); + else if (reads_from_promise) + return reads_from_promise->get_value(); + return VALUE_NONE; /* Only for new actions with no reads-from */ +} + +/** + * @brief Get the value written by this store + * + * We differentiate this function from ModelAction::get_reads_from_value and + * ModelAction::get_value for the purpose of RMW's, which may have both a + * 'read' and a 'write' value. + * + * Note: 'this' must be a store. + * + * @return The value written by this store + */ +uint64_t ModelAction::get_write_value() const +{ + ASSERT(is_write()); + return value; +} + /** @return The Node associated with this ModelAction */ Node * ModelAction::get_node() const { @@ -392,9 +430,10 @@ Node * ModelAction::get_node() const */ void ModelAction::set_read_from(const ModelAction *act) { + ASSERT(act); reads_from = act; reads_from_promise = NULL; - if (act && act->is_uninitialized()) + if (act->is_uninitialized()) model->assert_bug("May read from uninitialized atomic\n"); } @@ -510,10 +549,10 @@ void ModelAction::print() const } uint64_t valuetoprint; - if (is_read() && reads_from) - valuetoprint = reads_from->value; - else if (is_read() && reads_from_promise) - valuetoprint = reads_from_promise->get_value(); + if (is_read()) + valuetoprint = get_reads_from_value(); + else if (is_write()) + valuetoprint = get_write_value(); else valuetoprint = value;