Complete the transfer of deletions of some actions
[c11tester.git] / action.h
index 95167c437a0ff91a6f05405ea6c810ad8d403f81..f792de215994097605ec084b83c9d671f60f6ceb 100644 (file)
--- a/action.h
+++ b/action.h
@@ -34,6 +34,7 @@ using std::memory_order_seq_cst;
  * iteself does not indicate no value.
  */
 #define VALUE_NONE 0xdeadbeef
+#define WRITE_REFERENCED ((void *)0x1)
 
 /**
  * @brief The "location" at which a fence occurs
@@ -77,7 +78,8 @@ typedef enum action_type {
        ATOMIC_WAIT,    // < A wait action
        ATOMIC_TIMEDWAIT,       // < A timed wait action
        ATOMIC_ANNOTATION,      // < An annotation action to pass information to a trace analysis
-       READY_FREE
+       READY_FREE,     // < Write is ready to be freed
+       ATOMIC_NOP      // < Placeholder
 } action_type_t;
 
 
@@ -101,6 +103,9 @@ public:
 
        thread_id_t get_tid() const { return tid; }
        action_type get_type() const { return type; }
+       void set_type(action_type _type) { type = _type; }
+       action_type get_original_type() const { return original_type; }
+       void set_original_type(action_type _type) { original_type = _type; }
        void set_free() { type = READY_FREE; }
        memory_order get_mo() const { return order; }
        memory_order get_original_mo() const { return original_order; }
@@ -115,6 +120,7 @@ public:
        ModelAction * get_reads_from() const { return reads_from; }
        uint64_t get_time() const {return time;}
        cdsc::mutex * get_mutex() const;
+       bool get_swap_flag() const { return swap_flag; }
 
        void set_read_from(ModelAction *act);
 
@@ -136,6 +142,7 @@ public:
        bool is_trylock() const;
        bool is_unlock() const;
        bool is_wait() const;
+       bool is_create() const;
        bool is_notify() const;
        bool is_notify_one() const;
        bool is_success_lock() const;
@@ -185,6 +192,8 @@ public:
        bool equals(const ModelAction *x) const { return this == x; }
        void set_value(uint64_t val) { value = val; }
 
+       void use_original_type();
+
        /* to accomodate pthread create and join */
        Thread * thread_operand;
        void set_thread_operand(Thread *th) { thread_operand = th; }
@@ -194,6 +203,11 @@ public:
        sllnode<ModelAction *> * getTraceRef() { return trace_ref; }
        sllnode<ModelAction *> * getThrdMapRef() { return thrdmap_ref; }
        sllnode<ModelAction *> * getActionRef() { return action_ref; }
+
+       void incr_func_ref_count() { func_ref_count++; }
+       void decr_func_ref_count() { if (func_ref_count > 0) func_ref_count--; }
+       uint32_t get_func_ref_count() { return func_ref_count; }
+
        SNAPSHOTALLOC
 private:
        const char * get_type_str() const;
@@ -232,6 +246,8 @@ private:
        sllnode<ModelAction *> * thrdmap_ref;
        sllnode<ModelAction *> * action_ref;
 
+       /** @brief Number of read actions that are reading from this store */
+       uint32_t func_ref_count;
 
        /** @brief The value written (for write or RMW; undefined for read) */
        uint64_t value;
@@ -239,6 +255,14 @@ private:
        /** @brief Type of action (read, write, RMW, fence, thread create, etc.) */
        action_type type;
 
+       /** @brief The original type of action (read, write, RMW) before it was 
+        * set as READY_FREE or weaken from a RMW to a write */
+       action_type original_type;
+
+       /** @brief Indicate whether the action type and the original action type 
+        *  has been swapped. */
+       bool swap_flag;
+
        /** @brief The memory order for this operation. */
        memory_order order;