- // Explore interleavings of seqcst writes to guarantee total order
- // of seq_cst operations that don't commute
- if ((is_write() || act->is_write()) && is_seqcst() && act->is_seqcst())
+ // Explore interleavings of seqcst writes/fences to guarantee total
+ // order of seq_cst operations that don't commute
+ if ((could_be_write() || act->could_be_write() || is_fence() || act->is_fence())
+ && is_seqcst() && act->is_seqcst())
+ return true;
+
+ // Explore synchronizing read/write/fence pairs
+ if (is_acquire() && act->is_release() && (is_read() || is_fence()) &&
+ (act->could_be_write() || act->is_fence()))
+ 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() )