- // 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()))