Merge branch 'master' into brian
[c11tester.git] / action.cc
index f41b0eba7643e18a912b776c71470eddf71a1bf7..39b0f7f6d4847207f0dc2a18da5b0edeffa5776a 100644 (file)
--- a/action.cc
+++ b/action.cc
@@ -10,6 +10,7 @@ ModelAction::ModelAction(action_type_t type, memory_order order, void *loc, int
        order(order),
        location(loc),
        value(value),
+       reads_from(NULL),
        cv(NULL)
 {
        Thread *t = thread_current();
@@ -101,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())
@@ -132,6 +133,7 @@ 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;
 }
 
@@ -153,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;
@@ -175,8 +180,10 @@ void ModelAction::print(void) const
                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: %-4d",
                        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();