X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=action.h;h=66ba753b58131bdc1235bfd7276fc1416b8e22f3;hp=32cada2b9db88f306cf3dc52df6b1bd473640709;hb=5cd52219ebdf8ecf620f028a7639c6c31ad17df4;hpb=a27eec056d90e248a071bea6912e5ab09dea8242 diff --git a/action.h b/action.h index 32cada2b..66ba753b 100644 --- a/action.h +++ b/action.h @@ -14,6 +14,7 @@ #include "modeltypes.h" class ClockVector; +class Thread; using std::memory_order; using std::memory_order_relaxed; @@ -25,7 +26,7 @@ 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. */ -#define VALUE_NONE 1234567890 +#define VALUE_NONE 0xdeadbeef /** A special value to represent a successful trylock */ @@ -37,6 +38,8 @@ using std::memory_order_seq_cst; /** @brief Represents an action type, identifying one of several types of * ModelAction */ typedef enum action_type { + MODEL_FIXUP_RELSEQ, /**< Special ModelAction: finalize a release + * sequence */ THREAD_CREATE, /**< A thread creation action */ THREAD_START, /**< First action in each thread */ THREAD_YIELD, /**< A thread yield action */ @@ -52,7 +55,10 @@ typedef enum action_type { ATOMIC_FENCE, /**< A fence action */ ATOMIC_LOCK, /**< A lock action */ ATOMIC_TRYLOCK, /**< A trylock action */ - ATOMIC_UNLOCK /**< An unlock action */ + ATOMIC_UNLOCK, /**< An unlock action */ + ATOMIC_NOTIFY_ONE, /**< A notify_one action */ + ATOMIC_NOTIFY_ALL, /**< A notify all action */ + ATOMIC_WAIT /**< A wait action */ } action_type_t; /* Forward declaration */ @@ -64,7 +70,7 @@ class ClockVector; */ class ModelAction { public: - ModelAction(action_type_t type, memory_order order, void *loc, uint64_t value = VALUE_NONE); + ModelAction(action_type_t type, memory_order order, void *loc, uint64_t value = VALUE_NONE, Thread *thread = NULL); ~ModelAction(); void print() const; @@ -82,30 +88,36 @@ public: void copy_from_new(ModelAction *newaction); void set_seq_number(modelclock_t num); void set_try_lock(bool obtainedlock); + bool is_relseq_fixup() const; bool is_mutex_op() const; bool is_lock() const; bool is_trylock() const; bool is_unlock() const; + bool is_wait() const; + bool is_notify() const; + bool is_notify_one() const; bool is_success_lock() const; bool is_failed_trylock() const; bool is_read() const; bool is_write() const; + bool could_be_write() const; bool is_rmwr() const; bool is_rmwc() const; bool is_rmw() const; bool is_fence() const; bool is_initialization() const; + bool is_relaxed() const; bool is_acquire() const; bool is_release() const; bool is_seqcst() const; bool same_var(const ModelAction *act) const; bool same_thread(const ModelAction *act) const; bool is_conflicting_lock(const ModelAction *act) const; - bool is_synchronizing(const ModelAction *act) const; + bool could_synchronize_with(const ModelAction *act) const; void create_cv(const ModelAction *parent = NULL); ClockVector * get_cv() const { return cv; } - void read_from(const ModelAction *act); + bool read_from(const ModelAction *act); bool synchronize_with(const ModelAction *act); bool has_synchronized_with(const ModelAction *act) const; @@ -121,6 +133,10 @@ public: void process_rmw(ModelAction * act); void copy_typeandorder(ModelAction * act); + void set_sleep_flag() { sleep_flag=true; } + bool get_sleep_flag() { return sleep_flag; } + unsigned int hash() const; + MEMALLOC private: @@ -151,8 +167,10 @@ private: /** The clock vector stored with this action; only needed if this * action is a store release? */ ClockVector *cv; + + bool sleep_flag; }; -typedef std::list action_list_t; +typedef std::list< ModelAction *, SnapshotAlloc > action_list_t; #endif /* __ACTION_H__ */