Fix snapshot code
[model-checker.git] / action.cc
index e2557f0ad9fe3bac1083aca81fc67749dc6e8e82..d4c6253caf20c23411c60ba350a91760c386e6fc 100644 (file)
--- a/action.cc
+++ b/action.cc
@@ -9,6 +9,7 @@
 #include "common.h"
 #include "threads-model.h"
 #include "nodestack.h"
 #include "common.h"
 #include "threads-model.h"
 #include "nodestack.h"
+#include "wildcard.h"
 
 #define ACTION_INITIAL_CLOCK 0
 
 
 #define ACTION_INITIAL_CLOCK 0
 
@@ -34,6 +35,7 @@ ModelAction::ModelAction(action_type_t type, memory_order order, void *loc,
                uint64_t value, Thread *thread) :
        type(type),
        order(order),
                uint64_t value, Thread *thread) :
        type(type),
        order(order),
+       original_order(order),
        location(loc),
        value(value),
        reads_from(NULL),
        location(loc),
        value(value),
        reads_from(NULL),
@@ -192,6 +194,11 @@ bool ModelAction::is_initialization() const
        return type == ATOMIC_INIT;
 }
 
        return type == ATOMIC_INIT;
 }
 
+bool ModelAction::is_annotation() const
+{
+       return type == ATOMIC_ANNOTATION;
+}
+
 bool ModelAction::is_relaxed() const
 {
        return order == std::memory_order_relaxed;
 bool ModelAction::is_relaxed() const
 {
        return order == std::memory_order_relaxed;
@@ -323,7 +330,7 @@ bool ModelAction::could_synchronize_with(const ModelAction *act) const
                return false;
 
        // Different locations commute
                return false;
 
        // Different locations commute
-       if (!same_var(act))
+       if (!same_var(act) && !is_fence() && !act->is_fence())
                return false;
 
        // Explore interleavings of seqcst writes/fences to guarantee total
                return false;
 
        // Explore interleavings of seqcst writes/fences to guarantee total
@@ -478,7 +485,10 @@ void ModelAction::set_read_from(const ModelAction *act)
        reads_from = act;
        reads_from_promise = NULL;
        if (act->is_uninitialized())
        reads_from = act;
        reads_from_promise = NULL;
        if (act->is_uninitialized())
-               model->assert_bug("May read from uninitialized atomic\n");
+               model->assert_bug("May read from uninitialized atomic:\n"
+                               "    action %d, thread %d, location %p (%s, %s)",
+                               seq_number, id_to_int(tid), location,
+                               get_type_str(), get_mo_str());
 }
 
 /**
 }
 
 /**
@@ -544,7 +554,8 @@ const char * ModelAction::get_type_str() const
                case ATOMIC_TRYLOCK: return "trylock";
                case ATOMIC_WAIT: return "wait";
                case ATOMIC_NOTIFY_ONE: return "notify one";
                case ATOMIC_TRYLOCK: return "trylock";
                case ATOMIC_WAIT: return "wait";
                case ATOMIC_NOTIFY_ONE: return "notify one";
-               case ATOMIC_NOTIFY_ALL: return "notify all";
+         case ATOMIC_NOTIFY_ALL: return "notify all";
+         case ATOMIC_ANNOTATION: return "annotation";
                default: return "unknown type";
        };
 }
                default: return "unknown type";
        };
 }
@@ -566,25 +577,25 @@ void ModelAction::print() const
 {
        const char *type_str = get_type_str(), *mo_str = get_mo_str();
 
 {
        const char *type_str = get_type_str(), *mo_str = get_mo_str();
 
-       model_print("(%4d) Thread: %-2d   Action: %-13s   MO: %7s  Loc: %14p   Value: %-#18" PRIx64,
+       model_print("%-4d %-2d   %-13s   %7s  %14p   %-#18" PRIx64,
                        seq_number, id_to_int(tid), type_str, mo_str, location, get_return_value());
        if (is_read()) {
                if (reads_from)
                        seq_number, id_to_int(tid), type_str, mo_str, location, get_return_value());
        if (is_read()) {
                if (reads_from)
-                       model_print("  Rf: %-3d", reads_from->get_seq_number());
+                       model_print("  %-3d", reads_from->get_seq_number());
                else if (reads_from_promise) {
                        int idx = reads_from_promise->get_index();
                        if (idx >= 0)
                else if (reads_from_promise) {
                        int idx = reads_from_promise->get_index();
                        if (idx >= 0)
-                               model_print("  Rf: P%-2d", idx);
+                               model_print("  P%-2d", idx);
                        else
                        else
-                               model_print("  Rf: P? ");
+                               model_print("  P? ");
                } else
                } else
-                       model_print("  Rf: ?  ");
+                       model_print("  ?  ");
        }
        if (cv) {
                if (is_read())
                        model_print(" ");
                else
        }
        if (cv) {
                if (is_read())
                        model_print(" ");
                else
-                       model_print("          ");
+                       model_print("      ");
                cv->print();
        } else
                model_print("\n");
                cv->print();
        } else
                model_print("\n");