fix a bug about get_reads_from_value
[c11tester.git] / action.cc
index 30ac2c82643dadc328926f86bf346da20bdf498d..b654a35422a6cb3533a3236159d9048f5ab661a7 100644 (file)
--- a/action.cc
+++ b/action.cc
@@ -40,6 +40,7 @@ ModelAction::ModelAction(action_type_t type, memory_order order, void *loc,
        cv(NULL),
        rf_cv(NULL),
        value(value),
+       reads_from_value(VALUE_NONE),
        type(type),
        order(order),
        original_order(order),
@@ -54,16 +55,14 @@ ModelAction::ModelAction(action_type_t type, memory_order order, void *loc,
 
 
 /**
- * @brief Construct a new ModelAction
+ * @brief Construct a new ModelAction for sleep actions
  *
- * @param type The type of action
+ * @param type The type of action: THREAD_SLEEP
  * @param order The memory order of this action. A "don't care" for non-ATOMIC
  * actions (e.g., THREAD_* or MODEL_* actions).
  * @param loc The location that this action acts upon
- * @param value (optional) A value associated with the action (e.g., the value
- * read or written). Defaults to a given macro constant, for debugging purposes.
- * @param thread (optional) The Thread in which this action occurred. If NULL
- * (default), then a Thread is assigned according to the scheduler.
+ * @param value The time duration a thread is scheduled to sleep.
+ * @param _time The this sleep action is constructed
  */
 ModelAction::ModelAction(action_type_t type, memory_order order, uint64_t value, uint64_t _time) :
        location(NULL),
@@ -74,6 +73,7 @@ ModelAction::ModelAction(action_type_t type, memory_order order, uint64_t value,
        cv(NULL),
        rf_cv(NULL),
        value(value),
+        reads_from_value(VALUE_NONE),
        type(type),
        order(order),
        original_order(order),
@@ -105,6 +105,7 @@ ModelAction::ModelAction(action_type_t type, memory_order order, void *loc,
        cv(NULL),
        rf_cv(NULL),
        value(value),
+        reads_from_value(VALUE_NONE),
        type(type),
        order(order),
        original_order(order),
@@ -140,6 +141,7 @@ ModelAction::ModelAction(action_type_t type, const char * position, memory_order
        cv(NULL),
        rf_cv(NULL),
        value(value),
+        reads_from_value(VALUE_NONE),
        type(type),
        order(order),
        original_order(order),
@@ -176,6 +178,7 @@ ModelAction::ModelAction(action_type_t type, const char * position, memory_order
        cv(NULL),
        rf_cv(NULL),
        value(value),
+        reads_from_value(VALUE_NONE),
        type(type),
        order(order),
        original_order(order),
@@ -186,7 +189,6 @@ ModelAction::ModelAction(action_type_t type, const char * position, memory_order
 
        Thread *t = thread ? thread : thread_current();
        this->tid = t->get_id();
-       // model_print("position: %s\n", position);
 }
 
 
@@ -574,8 +576,12 @@ void ModelAction::set_try_lock(bool obtainedlock)
 uint64_t ModelAction::get_reads_from_value() const
 {
        ASSERT(is_read());
-       if (reads_from)
-               return reads_from->get_write_value();
+       if (reads_from) {
+               if (reads_from->is_uninitialized())
+                       return reads_from_value;
+               else
+                       return reads_from->get_write_value();
+       }
 
        return VALUE_NONE;      // Only for new actions with no reads-from
 }
@@ -626,12 +632,12 @@ void ModelAction::set_read_from(ModelAction *act)
        ASSERT(act);
 
        reads_from = act;
-
        if (act->is_uninitialized()) {  // WL
                uint64_t val = *((uint64_t *) location);
                ModelAction * act_uninitialized = (ModelAction *)act;
                act_uninitialized->set_value(val);
                reads_from = act_uninitialized;
+               reads_from_value = val;
 
 // disabled by WL, because LLVM IR is unable to detect atomic init
 /*             model->assert_bug("May read from uninitialized atomic:\n"