X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=action.cc;h=121f5ee7499d7161257dd136e5edd646bc8c8c94;hb=2ca6ef09383bf8845c18bb478396da3a260da08f;hp=5ecc1f0e1b26f069650a47e139858eef68e05595;hpb=9bbf98ac065e34fc1c35538328d02d51e74ccc0f;p=model-checker.git diff --git a/action.cc b/action.cc index 5ecc1f0..121f5ee 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,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; @@ -124,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 @@ -334,27 +346,21 @@ void ModelAction::set_try_lock(bool obtainedlock) { value=VALUE_TRYFAILED; } +/** @return The Node associated with this ModelAction */ +Node * ModelAction::get_node() const +{ + return node; +} + /** * Update the model action's read_from action * @param act The action to read from; should be a write - * @return True if this read established synchronization */ -bool ModelAction::read_from(const ModelAction *act) +void ModelAction::set_read_from(const ModelAction *act) { - ASSERT(cv); reads_from = act; - if (act != NULL && this->is_acquire()) { - rel_heads_list_t release_heads; - model->get_release_seq_heads(this, &release_heads); - int num_heads = release_heads.size(); - for (unsigned int i = 0; i < release_heads.size(); i++) - if (!synchronize_with(release_heads[i])) { - model->set_bad_synchronization(); - num_heads--; - } - return num_heads > 0; - } - return false; + if (act && act->is_uninitialized()) + model->assert_bug("May read from uninitialized atomic\n"); } /** @@ -410,6 +416,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;