X-Git-Url: http://plrg.eecs.uci.edu/git/?p=model-checker.git;a=blobdiff_plain;f=action.h;h=9fa7a91c3f93443714f54ec34b153c4d09a1c20b;hp=e43955dda2826d980f632bf62af4e08397594d45;hb=16ef61e0af2f98a34acaa919077def37ece3b5bd;hpb=9fc455aa88e0fe0415081e282bd1bda4c633fa8f diff --git a/action.h b/action.h index e43955d..9fa7a91 100644 --- a/action.h +++ b/action.h @@ -11,7 +11,14 @@ #include "threads.h" #include "mymemory.h" #include "clockvector.h" -#include "libatomic.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,11 +32,15 @@ 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_INIT /**< Initialization of an atomic object (e.g., + 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()) */ + ATOMIC_FENCE } action_type_t; /* Forward declaration */ @@ -58,7 +69,10 @@ public: bool is_read() const; bool is_write() const; + bool is_rmwr() const; + bool is_rmwc() const; bool is_rmw() const; + bool is_fence() const; bool is_initialization() const; bool is_acquire() const; bool is_release() const; @@ -70,7 +84,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,7 +96,8 @@ public: return get_seq_number() > act.get_seq_number(); } - void upgrade_rmw(ModelAction * act); + void process_rmw(ModelAction * act); + void copy_typeandorder(ModelAction * act); MEMALLOC private: