#include "common.h"
#include "threads-model.h"
#include "nodestack.h"
+#include "wildcard.h"
#define ACTION_INITIAL_CLOCK 0
uint64_t value, Thread *thread) :
type(type),
order(order),
+ original_order(order),
location(loc),
value(value),
reads_from(NULL),
return type == ATOMIC_INIT;
}
+bool ModelAction::is_annotation() const
+{
+ return type == ATOMIC_ANNOTATION;
+}
+
bool ModelAction::is_relaxed() const
{
return order == std::memory_order_relaxed;
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
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());
}
/**
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";
};
}
{
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)
- 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)
- model_print(" Rf: P%-2d", idx);
+ model_print(" P%-2d", idx);
else
- model_print(" Rf: P? ");
+ model_print(" P? ");
} else
- model_print(" Rf: ? ");
+ model_print(" ? ");
}
if (cv) {
if (is_read())
model_print(" ");
else
- model_print(" ");
+ model_print(" ");
cv->print();
} else
model_print("\n");