change the namespace of mutex from std to cdsc
[c11tester.git] / action.cc
index 2010a0b61fd76a66bc2102a8ed2f4562491ad3e5..14160052d24cac65f75161f5a152c6b1f3f4200d 100644 (file)
--- a/action.cc
+++ b/action.cc
@@ -9,6 +9,7 @@
 #include "common.h"
 #include "threads-model.h"
 #include "nodestack.h"
+#include "wildcard.h"
 
 #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),
+       original_order(order),
        location(loc),
        value(value),
        reads_from(NULL),
@@ -86,7 +88,7 @@ bool ModelAction::is_thread_start() const
 
 bool ModelAction::is_thread_join() const
 {
-       return type == THREAD_JOIN;
+       return type == THREAD_JOIN || type == PTHREAD_JOIN;
 }
 
 bool ModelAction::is_relseq_fixup() const
@@ -275,13 +277,18 @@ void ModelAction::copy_typeandorder(ModelAction * act)
 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;
 }
 
@@ -328,7 +335,7 @@ bool ModelAction::could_synchronize_with(const ModelAction *act) const
                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
@@ -480,13 +487,23 @@ Node * ModelAction::get_node() const
 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());
+*/
+       }
 }
 
 /**
@@ -539,6 +556,10 @@ const char * ModelAction::get_type_str() const
                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";
@@ -553,7 +574,7 @@ const char * ModelAction::get_type_str() const
                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";
        };
 }
@@ -575,7 +596,7 @@ void ModelAction::print() const
 {
        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)
@@ -647,12 +668,12 @@ bool ModelAction::may_read_from(const Promise *promise) const
  * 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;
 }