From 3455eccab56ee5132bea049bb9b1df804d5b8d71 Mon Sep 17 00:00:00 2001 From: weiyu Date: Mon, 24 Jun 2019 13:33:04 -0700 Subject: [PATCH] fix a bug for ATOMIC_RMWCAS --- action.cc | 34 ++++++++++++++++++++++++++++++++++ action.h | 1 + cmodelint.cc | 2 +- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/action.cc b/action.cc index 9a816de3..3059e0d9 100644 --- a/action.cc +++ b/action.cc @@ -87,6 +87,40 @@ ModelAction::ModelAction(action_type_t type, memory_order order, void *loc, } +/** + * @brief Construct a new ModelAction with source line number (requires llvm support) + * + * @param type The type of action + * @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 size (optional) The Thread in which this action occurred. If NULL + * (default), then a Thread is assigned according to the scheduler. + */ +ModelAction::ModelAction(action_type_t type, const char * position, memory_order order, void *loc, + uint64_t value, int size) : + location(loc), + position(position), + reads_from(NULL), + last_fence_release(NULL), + node(NULL), + cv(NULL), + value(value), + type(type), + order(order), + original_order(order), + seq_number(ACTION_INITIAL_CLOCK) +{ + /* References to NULL atomic variables can end up here */ + ASSERT(loc); + this->size = size; + Thread *t = thread_current(); + this->tid = t->get_id(); +} + + /** * @brief Construct a new ModelAction with source line number (requires llvm support) * diff --git a/action.h b/action.h index 5f7d25c3..a2a947bd 100644 --- a/action.h +++ b/action.h @@ -86,6 +86,7 @@ class ModelAction { public: ModelAction(action_type_t type, memory_order order, void *loc, uint64_t value = VALUE_NONE, Thread *thread = NULL); ModelAction(action_type_t type, memory_order order, void *loc, uint64_t value, int size); + ModelAction(action_type_t type, const char * position, memory_order order, void *loc, uint64_t value, int size); ModelAction(action_type_t type, const char * position, memory_order order, void *loc, uint64_t value = VALUE_NONE, Thread *thread = NULL); ~ModelAction(); void print() const; diff --git a/cmodelint.cc b/cmodelint.cc index 3dbb437b..184bb40e 100644 --- a/cmodelint.cc +++ b/cmodelint.cc @@ -61,7 +61,7 @@ void model_fence_action(memory_order ord) { /* --- helper functions --- */ uint64_t model_rmwrcas_action_helper(void *obj, int atomic_index, uint64_t oldval, int size, const char *position) { return model->switch_to_master( - new ModelAction(ATOMIC_RMWRCAS, position, orders[atomic_index], obj) + new ModelAction(ATOMIC_RMWRCAS, position, orders[atomic_index], obj, oldval, size) ); } -- 2.34.1