X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=action.cc;h=16f2327e8dc73de1ef564747bb27ae8c54c639fd;hb=51d0154de2ac3c660a58c3f377f4092c6fd1621b;hp=44a6d9ad6948c116e3305bd955e204825f01bc96;hpb=a2176c7545c29b28598bb252718cf080a3463665;p=model-checker.git diff --git a/action.cc b/action.cc index 44a6d9a..16f2327 100644 --- a/action.cc +++ b/action.cc @@ -76,7 +76,7 @@ bool ModelAction::is_relseq_fixup() const bool ModelAction::is_mutex_op() const { - return type == ATOMIC_LOCK || type == ATOMIC_TRYLOCK || type == ATOMIC_UNLOCK; + return type == ATOMIC_LOCK || type == ATOMIC_TRYLOCK || type == ATOMIC_UNLOCK || type == ATOMIC_WAIT || type == ATOMIC_NOTIFY_ONE || type == ATOMIC_NOTIFY_ALL; } bool ModelAction::is_lock() const @@ -84,6 +84,18 @@ bool ModelAction::is_lock() const return type == ATOMIC_LOCK; } +bool ModelAction::is_wait() const { + return type == ATOMIC_WAIT; +} + +bool ModelAction::is_notify() const { + return type==ATOMIC_NOTIFY_ONE || type==ATOMIC_NOTIFY_ALL; +} + +bool ModelAction::is_notify_one() const { + return type==ATOMIC_NOTIFY_ONE; +} + bool ModelAction::is_unlock() const { return type == ATOMIC_UNLOCK; @@ -175,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; } @@ -232,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; } @@ -250,6 +296,10 @@ bool ModelAction::is_conflicting_lock(const ModelAction *act) const if (act->is_unlock() && is_trylock() && value == VALUE_TRYSUCCESS) return true; + //Try to push a successful trylock past a wait + if (act->is_wait() && is_trylock() && value == VALUE_TRYSUCCESS) + return true; + return false; } @@ -382,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"; }