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