class ActionDispatch::DebugLocks
def blocked_by?(victim, blocker, all_threads)
def blocked_by?(victim, blocker, all_threads) return false if victim.equal?(blocker) case victim[:sleeper] when :start_sharing blocker[:exclusive] || (!victim[:waiting] && blocker[:compatible] && !blocker[:compatible].include?(false)) when :start_exclusive blocker[:sharing] > 0 || blocker[:exclusive] || (blocker[:compatible] && !blocker[:compatible].include?(victim[:purpose])) when :yield_shares blocker[:exclusive] when :stop_exclusive blocker[:exclusive] || victim[:compatible] && victim[:compatible].include?(blocker[:purpose]) && all_threads.all? { |other| !other[:compatible] || blocker.equal?(other) || other[:compatible].include?(blocker[:purpose]) } end end