Turn the number of waiters behind a held guard into an enter, backoff, or page remediation action.

guard contention The waiter count behind a held guard is kept as a scalar so the remediation action stays deterministic and never depends on scheduler timing or lock identity.

Mutex Guard Remediation Report

waiters
mutex_guard_remediation_report.rb
Replay: real traced execution (multi-file project)
waiters = 0
guard_limit = 2
acquired = 1

action = if waiters == 0
  "enter"
elsif waiters <= guard_limit
  "backoff"
else
  "page"
end

puts "waiters=#{waiters}"
puts "acquired=#{acquired}"
puts "action=#{action}"
waiters = 1
guard_limit = 2
acquired = 1

action = if waiters == 0
  "enter"
elsif waiters <= guard_limit
  "backoff"
else
  "page"
end

puts "waiters=#{waiters}"
puts "acquired=#{acquired}"
puts "action=#{action}"
waiters = 3
guard_limit = 2
acquired = 1

action = if waiters == 0
  "enter"
elsif waiters <= guard_limit
  "backoff"
else
  "page"
end

puts "waiters=#{waiters}"
puts "acquired=#{acquired}"
puts "action=#{action}"
  1. waiters ← 0, guard_limit ← 2, acquired ← 1, action ← enter

    1waiters→ 0 = 0  #@waiters=1, 32guard_limit→ 2 = 23acquired→ 1 = 145action→ enter = if waiters0 == 06  "enter"7elsif waiters0 <= guard_limit28  "backoff"9else10  "page"11end1213puts "waiters=#{waiters0}"14puts "acquired=#{acquired1}"15puts "action=#{actionenter}"
    outputwaiters=0
    acquired=1
    action=enter
  1. waiters ← 1, guard_limit ← 2, acquired ← 1, action ← backoff

    1waiters→ 1 = 12guard_limit→ 2 = 23acquired→ 1 = 145action→ backoff = if waiters1 == 06  "enter"7elsif waiters1 <= guard_limit28  "backoff"9else10  "page"11end1213puts "waiters=#{waiters1}"14puts "acquired=#{acquired1}"15puts "action=#{actionbackoff}"
    outputwaiters=1
    acquired=1
    action=backoff
  1. waiters ← 3, guard_limit ← 2, acquired ← 1, action ← page

    1waiters→ 3 = 32guard_limit→ 2 = 23acquired→ 1 = 145action→ page = if waiters3 == 06  "enter"7elsif waiters3 <= guard_limit28  "backoff"9else10  "page"11end1213puts "waiters=#{waiters3}"14puts "acquired=#{acquired1}"15puts "action=#{actionpage}"
    outputwaiters=3
    acquired=1
    action=page