X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=action.cc;h=a11467587901f258a03b9e11623403f60f3d1263;hb=ac8e176cd4a8756244c12dbbcaf961d27bfc8a74;hp=41a025ab7e6f463f4e1068b029e6fbf26683d39f;hpb=39c0de028fe3b1c1d229ecf715007c751ddab445;p=model-checker.git diff --git a/action.cc b/action.cc index 41a025a..a114675 100644 --- 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 @@ -246,7 +264,7 @@ void ModelAction::process_rmw(ModelAction * act) { */ bool ModelAction::could_synchronize_with(const ModelAction *act) const { - //Same thread can't be reordered + // Same thread can't be reordered if (same_thread(act)) return false; @@ -265,15 +283,15 @@ bool ModelAction::could_synchronize_with(const ModelAction *act) const (act->could_be_write() || act->is_fence())) return true; - //lock just released...we can grab lock + // lock just released...we can grab lock if ((is_lock() ||is_trylock()) && (act->is_unlock()||act->is_wait())) return true; - //lock just acquired...we can fail to grab lock + // lock just acquired...we can fail to grab lock if (is_trylock() && act->is_success_lock()) return true; - //other thread stalling on lock...we can release lock + // other thread stalling on lock...we can release lock if (is_unlock() && (act->is_trylock()||act->is_lock())) return true; @@ -292,19 +310,19 @@ bool ModelAction::could_synchronize_with(const ModelAction *act) const bool ModelAction::is_conflicting_lock(const ModelAction *act) const { - //Must be different threads to reorder + // Must be different threads to reorder if (same_thread(act)) return false; - //Try to reorder a lock past a successful lock + // Try to reorder a lock past a successful lock if (act->is_success_lock()) return true; - //Try to push a successful trylock past an unlock + // Try to push a successful trylock past an unlock if (act->is_unlock() && is_trylock() && value == VALUE_TRYSUCCESS) return true; - //Try to push a successful trylock past a wait + // Try to push a successful trylock past a wait if (act->is_wait() && is_trylock() && value == VALUE_TRYSUCCESS) return true; @@ -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; @@ -439,7 +470,11 @@ void ModelAction::print() const type_str = "unknown type"; } - uint64_t valuetoprint=type==ATOMIC_READ?(reads_from!=NULL?reads_from->value:VALUE_NONE):value; + uint64_t valuetoprint; + if (type == ATOMIC_READ && reads_from != NULL) + valuetoprint = reads_from->value; + else + valuetoprint = value; switch (this->order) { case std::memory_order_relaxed: