X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=action.cc;h=1387ed15b67c9ac25d7fcba68491bbb72d8ff236;hb=6b87c110fbda87ccec4f58b1e292d5f9434c8691;hp=57058921d95726fb5c8f305b5316e34a80e6d39d;hpb=ffc110b3aaa80564dbf85f3c6a9049efd40571f1;p=model-checker.git diff --git a/action.cc b/action.cc index 5705892..1387ed1 100644 --- a/action.cc +++ b/action.cc @@ -187,6 +187,19 @@ bool ModelAction::is_seqcst() const bool ModelAction::same_var(const ModelAction *act) const { + if ( act->is_wait() || is_wait() ) { + if ( act->is_wait() && is_wait() ) { + if ( ((void *)value) == ((void *)act->value) ) + return true; + } else if ( is_wait() ) { + if ( ((void *)value) == act->location ) + return true; + } else if ( act->is_wait() ) { + if ( location == ((void *)act->value) ) + return true; + } + } + return location == act->location; } @@ -244,6 +257,27 @@ bool ModelAction::could_synchronize_with(const ModelAction *act) const if (is_read() && is_acquire() && act->could_be_write() && act->is_release()) return true; + //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 + if (is_trylock() && act->is_success_lock()) + return true; + + //other thread stalling on lock...we can release lock + if (is_unlock() && (act->is_trylock()||act->is_lock())) + return true; + + if (is_trylock() && (act->is_unlock()||act->is_wait())) + return true; + + if ( is_notify() && act->is_wait() ) + return true; + + if ( is_wait() && act->is_notify() ) + return true; + // Otherwise handle by reads_from relation return false; } @@ -331,7 +365,7 @@ bool ModelAction::synchronize_with(const ModelAction *act) { bool ModelAction::has_synchronized_with(const ModelAction *act) const { - return cv->has_synchronized_with(act->cv); + return cv->synchronized_since(act); } /** @@ -398,6 +432,15 @@ void ModelAction::print() const case ATOMIC_TRYLOCK: type_str = "trylock"; break; + case ATOMIC_WAIT: + type_str = "wait"; + break; + case ATOMIC_NOTIFY_ONE: + type_str = "notify one"; + break; + case ATOMIC_NOTIFY_ALL: + type_str = "notify all"; + break; default: type_str = "unknown type"; } @@ -449,7 +492,7 @@ unsigned int ModelAction::hash() const unsigned int hash=(unsigned int) this->type; hash^=((unsigned int)this->order)<<3; hash^=seq_number<<5; - hash^=tid<<6; + hash ^= id_to_int(tid) << 6; if (is_read()) { if (reads_from)