X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=action.cc;h=a11467587901f258a03b9e11623403f60f3d1263;hb=ac8e176cd4a8756244c12dbbcaf961d27bfc8a74;hp=121f5ee7499d7161257dd136e5edd646bc8c8c94;hpb=b7fc616e174fe12b91216f3aeb0ce950d747349a;p=model-checker.git diff --git a/action.cc b/action.cc index 121f5ee..a114675 100644 --- a/action.cc +++ b/action.cc @@ -124,6 +124,12 @@ 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; @@ -258,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; @@ -277,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; @@ -304,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; @@ -349,6 +355,8 @@ void ModelAction::set_try_lock(bool obtainedlock) { /** @return The Node associated with this ModelAction */ Node * ModelAction::get_node() const { + /* UNINIT actions do not have a Node */ + ASSERT(!is_uninitialized()); return node; } @@ -462,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: