X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=action.h;h=3e590aae7f34a115cefb9fafed941a91d3bc5f92;hb=d4b8c4bcfb145de476c9473d80653a8849f295ed;hp=36c72079b165a6a7462d5a32698e61dbdef12dbd;hpb=baf7877f639380a66770d974ad4312c42dda338b;p=model-checker.git diff --git a/action.h b/action.h index 36c7207..3e590aa 100644 --- a/action.h +++ b/action.h @@ -9,9 +9,16 @@ #include #include "threads.h" -#include "libatomic.h" #include "mymemory.h" #include "clockvector.h" +#include "memoryorder.h" + +using std::memory_order; +using std::memory_order_relaxed; +using std::memory_order_acquire; +using std::memory_order_release; +using std::memory_order_acq_rel; +using std::memory_order_seq_cst; /** Note that this value can be legitimately used by a program, and hence by iteself does not indicate no value. */ @@ -25,9 +32,12 @@ typedef enum action_type { THREAD_START, /**< First action in each thread */ THREAD_YIELD, /**< A thread yield action */ THREAD_JOIN, /**< A thread join action */ + THREAD_FINISH, /**< A thread completion action */ ATOMIC_READ, /**< An atomic read action */ ATOMIC_WRITE, /**< An atomic write action */ - ATOMIC_RMW, /**< An atomic read-modify-write action */ + ATOMIC_RMWR, /**< The read part of an atomic RMW action */ + ATOMIC_RMW, /**< The write part of an atomic RMW action */ + ATOMIC_RMWC, /**< Convert an atomic RMW action into a READ */ ATOMIC_INIT /**< Initialization of an atomic object (e.g., * atomic_init()) */ } action_type_t; @@ -58,6 +68,8 @@ public: bool is_read() const; bool is_write() const; + bool is_rmwr() const; + bool is_rmwc() const; bool is_rmw() const; bool is_initialization() const; bool is_acquire() const; @@ -70,7 +82,9 @@ public: void create_cv(const ModelAction *parent = NULL); ClockVector * get_cv() const { return cv; } void read_from(const ModelAction *act); + void synchronize_with(const ModelAction *act); + bool has_synchronized_with(const ModelAction *act) const; bool happens_before(const ModelAction *act) const; inline bool operator <(const ModelAction& act) const { @@ -80,6 +94,9 @@ public: return get_seq_number() > act.get_seq_number(); } + void process_rmw(ModelAction * act); + void copy_typeandorder(ModelAction * act); + MEMALLOC private: @@ -95,8 +112,7 @@ private: /** The thread id that performed this action. */ thread_id_t tid; - /** The value read or written (if RMW, then the value written). This - * should probably be something longer. */ + /** The value written (for write or RMW; undefined for read) */ uint64_t value; /** The action that this action reads from. Only valid for reads */