action: add ATOMIC_UNINIT type
authorBrian Norris <banorris@uci.edu>
Fri, 7 Dec 2012 05:12:29 +0000 (21:12 -0800)
committerBrian Norris <banorris@uci.edu>
Fri, 7 Dec 2012 06:41:29 +0000 (22:41 -0800)
Adding a new type of "uninitialized atomic" action, to serve as a store
which, if any load is able to "see" this store, constitutes an
uninitialized load - a bug in the user program. It has to act like a
store operation, but it triggers a bug (ModelChecker::assert_bug) if any
load tries to read from it.

action.cc
action.h

index a90878f73d9edc34148359f127df6886d4574cd8..576f78a54bf6f27c79a89733de53e6a5d74c4990 100644 (file)
--- a/action.cc
+++ b/action.cc
@@ -66,6 +66,8 @@ void ModelAction::copy_from_new(ModelAction *newaction)
 
 void ModelAction::set_seq_number(modelclock_t num)
 {
+       /* ATOMIC_UNINIT actions should never have non-zero clock */
+       ASSERT(!is_uninitialized());
        ASSERT(seq_number == ACTION_INITIAL_CLOCK);
        seq_number = num;
 }
@@ -122,6 +124,11 @@ bool ModelAction::is_failed_trylock() const
        return (type == ATOMIC_TRYLOCK && value == VALUE_TRYFAILED);
 }
 
+bool ModelAction::is_uninitialized() const
+{
+       return type == ATOMIC_UNINIT;
+}
+
 bool ModelAction::is_read() const
 {
        return type == ATOMIC_READ || type == ATOMIC_RMWR || type == ATOMIC_RMW;
@@ -129,7 +136,7 @@ bool ModelAction::is_read() const
 
 bool ModelAction::is_write() const
 {
-       return type == ATOMIC_WRITE || type == ATOMIC_RMW || type == ATOMIC_INIT;
+       return type == ATOMIC_WRITE || type == ATOMIC_RMW || type == ATOMIC_INIT || type == ATOMIC_UNINIT;
 }
 
 bool ModelAction::could_be_write() const
@@ -346,6 +353,8 @@ void ModelAction::set_try_lock(bool obtainedlock) {
 void ModelAction::set_read_from(const ModelAction *act)
 {
        reads_from = act;
+       if (act && act->is_uninitialized())
+               model->assert_bug("May read from uninitialized atomic\n");
 }
 
 /**
@@ -401,6 +410,9 @@ void ModelAction::print() const
        case THREAD_FINISH:
                type_str = "thread finish";
                break;
+       case ATOMIC_UNINIT:
+               type_str = "uninitialized";
+               break;
        case ATOMIC_READ:
                type_str = "atomic read";
                break;
index be87eca33f7400da44e308a598c6c3084044d620..86012c123d5b18cb7404787c21183ea86d21055d 100644 (file)
--- a/action.h
+++ b/action.h
@@ -45,6 +45,7 @@ typedef enum action_type {
        THREAD_YIELD,         /**< A thread yield action */
        THREAD_JOIN,          /**< A thread join action */
        THREAD_FINISH,        /**< A thread completion action */
+       ATOMIC_UNINIT,        /**< Represents an uninitialized atomic */
        ATOMIC_READ,          /**< An atomic read action */
        ATOMIC_WRITE,         /**< An atomic write action */
        ATOMIC_RMWR,          /**< The read part of an atomic RMW action */
@@ -107,6 +108,7 @@ public:
        bool is_notify_one() const;
        bool is_success_lock() const;
        bool is_failed_trylock() const;
+       bool is_uninitialized() const;
        bool is_read() const;
        bool is_write() const;
        bool could_be_write() const;