no need to store into the object field... this will probably just lead to weird...
[model-checker.git] / action.cc
index 6627714e1089b2ad16c85cc7ef4abe43d77b6f95..adb31f8c39aaabfa06f2e954ff9b80e7ef650453 100644 (file)
--- a/action.cc
+++ b/action.cc
@@ -5,19 +5,17 @@
 #include "clockvector.h"
 #include "common.h"
 
-ModelAction::ModelAction(action_type_t type, memory_order order, void *loc, int value)
+ModelAction::ModelAction(action_type_t type, memory_order order, void *loc, uint64_t value) :
+       type(type),
+       order(order),
+       location(loc),
+       value(value),
+       reads_from(NULL),
+       cv(NULL)
 {
        Thread *t = thread_current();
-       ModelAction *act = this;
-
-       act->type = type;
-       act->order = order;
-       act->location = loc;
-       act->tid = t->get_id();
-       act->value = value;
-       act->seq_number = model->get_next_seq_num();
-
-       cv = NULL;
+       this->tid = t->get_id();
+       this->seq_number = model->get_next_seq_num();
 }
 
 ModelAction::~ModelAction()
@@ -33,7 +31,7 @@ bool ModelAction::is_read() const
 
 bool ModelAction::is_write() const
 {
-       return type == ATOMIC_WRITE;
+       return type == ATOMIC_WRITE || type == ATOMIC_INIT;
 }
 
 bool ModelAction::is_rmw() const
@@ -41,6 +39,11 @@ bool ModelAction::is_rmw() const
        return type == ATOMIC_RMW;
 }
 
+bool ModelAction::is_initialization() const
+{
+       return type == ATOMIC_INIT;
+}
+
 bool ModelAction::is_acquire() const
 {
        switch (order) {
@@ -99,7 +102,7 @@ bool ModelAction::is_synchronizing(const ModelAction *act) const
        // Different locations commute
        if (!same_var(act))
                return false;
-       
+
        // Explore interleavings of seqcst writes to guarantee total order
        // of seq_cst operations that don't commute
        if (is_write() && is_seqcst() && act->is_write() && act->is_seqcst())
@@ -115,7 +118,7 @@ bool ModelAction::is_synchronizing(const ModelAction *act) const
        return false;
 }
 
-void ModelAction::create_cv(ModelAction *parent)
+void ModelAction::create_cv(const ModelAction *parent)
 {
        ASSERT(cv == NULL);
 
@@ -125,11 +128,12 @@ void ModelAction::create_cv(ModelAction *parent)
                cv = new ClockVector(NULL, this);
 }
 
-void ModelAction::read_from(ModelAction *act)
+void ModelAction::read_from(const ModelAction *act)
 {
        ASSERT(cv);
        if (act->is_release() && this->is_acquire())
                cv->merge(act->cv);
+       reads_from = act;
        value = act->value;
 }
 
@@ -139,7 +143,7 @@ void ModelAction::read_from(ModelAction *act)
  * @return true if this action's thread has synchronized with act's thread
  * since the execution of act, false otherwise.
  */
-bool ModelAction::happens_before(ModelAction *act)
+bool ModelAction::happens_before(const ModelAction *act) const
 {
        return act->cv->synchronized_since(this);
 }
@@ -151,6 +155,9 @@ void ModelAction::print(void) const
        case THREAD_CREATE:
                type_str = "thread create";
                break;
+       case THREAD_START:
+               type_str = "thread start";
+               break;
        case THREAD_YIELD:
                type_str = "thread yield";
                break;
@@ -166,12 +173,17 @@ void ModelAction::print(void) const
        case ATOMIC_RMW:
                type_str = "atomic rmw";
                break;
+       case ATOMIC_INIT:
+               type_str = "init atomic";
+               break;
        default:
                type_str = "unknown type";
        }
 
-       printf("(%3d) Thread: %-2d    Action: %-13s    MO: %d    Loc: %14p    Value: %d",
+       printf("(%3d) Thread: %-2d    Action: %-13s    MO: %d    Loc: %14p    Value: %-8u",
                        seq_number, id_to_int(tid), type_str, order, location, value);
+       if (reads_from)
+               printf(" Rf: %d", reads_from->get_seq_number());
        if (cv) {
                printf("\t");
                cv->print();