action: add is_atomic_var()
[model-checker.git] / action.cc
index 41a025ab7e6f463f4e1068b029e6fbf26683d39f..a313b70fbe970810c96fe16bc1d7a0a27108508b 100644 (file)
--- a/action.cc
+++ b/action.cc
@@ -66,10 +66,17 @@ 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;
 }
 
+bool ModelAction::is_thread_start() const
+{
+       return type == THREAD_START;
+}
+
 bool ModelAction::is_relseq_fixup() const
 {
        return type == MODEL_FIXUP_RELSEQ;
@@ -117,6 +124,17 @@ bool ModelAction::is_failed_trylock() const
        return (type == ATOMIC_TRYLOCK && value == VALUE_TRYFAILED);
 }
 
+/** @return True if this operation is performed on a C/C++ atomic variable */
+bool ModelAction::is_atomic_var() const
+{
+       return is_read() || could_be_write();
+}
+
+bool ModelAction::is_uninitialized() const
+{
+       return type == ATOMIC_UNINIT;
+}
+
 bool ModelAction::is_read() const
 {
        return type == ATOMIC_READ || type == ATOMIC_RMWR || type == ATOMIC_RMW;
@@ -124,7 +142,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
@@ -334,6 +352,14 @@ void ModelAction::set_try_lock(bool obtainedlock) {
                value=VALUE_TRYFAILED;
 }
 
+/** @return The Node associated with this ModelAction */
+Node * ModelAction::get_node() const
+{
+       /* UNINIT actions do not have a Node */
+       ASSERT(!is_uninitialized());
+       return node;
+}
+
 /**
  * Update the model action's read_from action
  * @param act The action to read from; should be a write
@@ -341,6 +367,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");
 }
 
 /**
@@ -396,6 +424,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;