cv(NULL),
rf_cv(NULL),
value(value),
+ reads_from_value(VALUE_NONE),
type(type),
order(order),
original_order(order),
/**
- * @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),
cv(NULL),
rf_cv(NULL),
value(value),
+ reads_from_value(VALUE_NONE),
type(type),
order(order),
original_order(order),
cv(NULL),
rf_cv(NULL),
value(value),
+ reads_from_value(VALUE_NONE),
type(type),
order(order),
original_order(order),
cv(NULL),
rf_cv(NULL),
value(value),
+ reads_from_value(VALUE_NONE),
type(type),
order(order),
original_order(order),
cv(NULL),
rf_cv(NULL),
value(value),
+ reads_from_value(VALUE_NONE),
type(type),
order(order),
original_order(order),
Thread *t = thread ? thread : thread_current();
this->tid = t->get_id();
- // model_print("position: %s\n", position);
}
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
}
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"