#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),
bool ModelAction::is_thread_join() const
{
- return type == THREAD_JOIN;
+ return type == THREAD_JOIN || type == PTHREAD_JOIN;
}
bool ModelAction::is_relseq_fixup() const
Thread * ModelAction::get_thread_operand() const
{
if (type == THREAD_CREATE) {
- /* THREAD_CREATE stores its (Thread *) in a thrd_t::priv */
- thrd_t *thrd = (thrd_t *)get_location();
- return thrd->priv;
- } else if (type == THREAD_JOIN)
+ /* thread_operand is set in execution.cc */
+ return thread_operand;
+ } else if (type == PTHREAD_CREATE) {
+ return thread_operand;
+ } else if (type == THREAD_JOIN) {
/* THREAD_JOIN uses (Thread *) for location */
return (Thread *)get_location();
- else
+ } else if (type == PTHREAD_JOIN) {
+ // return NULL;
+ // thread_operand is stored in execution::pthread_map;
+ return (Thread *)get_location();
+ } else
return NULL;
}
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
void ModelAction::set_read_from(const ModelAction *act)
{
ASSERT(act);
+
reads_from = act;
reads_from_promise = NULL;
- if (act->is_uninitialized())
- model->assert_bug("May read from uninitialized atomic:\n"
+
+ if (act->is_uninitialized()) { // WL
+ uint64_t val = *((uint64_t *) location);
+ ModelAction * act_initialized = (ModelAction *)act;
+ act_initialized->set_value(val);
+ reads_from = (const ModelAction *)act_initialized;
+
+// disabled by WL, because LLVM IR is unable to detect atomic init
+/* 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 THREAD_YIELD: return "thread yield";
case THREAD_JOIN: return "thread join";
case THREAD_FINISH: return "thread finish";
+
+ case PTHREAD_CREATE: return "pthread create";
+ case PTHREAD_JOIN: return "pthread join";
+
case ATOMIC_UNINIT: return "uninitialized";
case ATOMIC_READ: return "atomic read";
case ATOMIC_WRITE: return "atomic write";
case ATOMIC_WAIT: return "wait";
case ATOMIC_NOTIFY_ONE: return "notify one";
case ATOMIC_NOTIFY_ALL: return "notify all";
- case ATOMIC_ANNOTATION: return "atomic annotation";
+ case ATOMIC_ANNOTATION: return "annotation";
default: return "unknown type";
};
}
{
const char *type_str = get_type_str(), *mo_str = get_mo_str();
- model_print("%-4d %-2d %-13s %7s %14p %-#18" PRIx64,
+ model_print("%-4d %-2d %-14s %7s %14p %-#18" PRIx64,
seq_number, id_to_int(tid), type_str, mo_str, location, get_return_value());
if (is_read()) {
if (reads_from)
* Only valid for LOCK, TRY_LOCK, UNLOCK, and WAIT operations.
* @return The mutex operated on by this action, if any; otherwise NULL
*/
-std::mutex * ModelAction::get_mutex() const
+cdsc::mutex * ModelAction::get_mutex() const
{
if (is_trylock() || is_lock() || is_unlock())
- return (std::mutex *)get_location();
+ return (cdsc::mutex *)get_location();
else if (is_wait())
- return (std::mutex *)get_value();
+ return (cdsc::mutex *)get_value();
else
return NULL;
}