if (!same_var(act))
return false;
- // Explore interleavings of seqcst writes to guarantee total order
- // of seq_cst operations that don't commute
- if ((could_be_write() || act->could_be_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 pairs
- if (is_read() && is_acquire() && act->could_be_write() && act->is_release())
+ // 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