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 atomic identity or scheduler timing.

Atomic Guard Remediation Report

waiters
AtomicGuardRemediationReport.kt
Replay: real traced execution (multi-file project)
fun main() {
    val waiters = 0
    val guardLimit = 2
    val acquired = 1

    val action = if (waiters == 0) {
        "enter"
    } else if (waiters <= guardLimit) {
        "backoff"
    } else {
        "page"
    }

    println("waiters=$waiters acquired=$acquired $action")
}
fun main() {
    val waiters = 1
    val guardLimit = 2
    val acquired = 1

    val action = if (waiters == 0) {
        "enter"
    } else if (waiters <= guardLimit) {
        "backoff"
    } else {
        "page"
    }

    println("waiters=$waiters acquired=$acquired $action")
}
fun main() {
    val waiters = 3
    val guardLimit = 2
    val acquired = 1

    val action = if (waiters == 0) {
        "enter"
    } else if (waiters <= guardLimit) {
        "backoff"
    } else {
        "page"
    }

    println("waiters=$waiters acquired=$acquired $action")
}
  1. waiters ← 0, guardLimit ← 2, acquired ← 1, action ← enter

    1fun main() {2    val waiters→ 0 = 0 //@waiters=1, 33    val guardLimit→ 2 = 24    val acquired→ 1 = 156    val action→ enter = if (waiters0 == 0) {7        "enter"8    } else if (waiters0 <= guardLimit2) {9        "backoff"10    } else {11        "page"12    }1314    println("waiters=$waiters0 acquired=$acquired1 $actionenter")15}
    outputwaiters=0 acquired=1 enter
  1. waiters ← 1, guardLimit ← 2, acquired ← 1, action ← backoff

    1fun main() {2    val waiters→ 1 = 13    val guardLimit→ 2 = 24    val acquired→ 1 = 156    val action→ backoff = if (waiters1 == 0) {7        "enter"8    } else if (waiters1 <= guardLimit2) {9        "backoff"10    } else {11        "page"12    }1314    println("waiters=$waiters1 acquired=$acquired1 $actionbackoff")15}
    outputwaiters=1 acquired=1 backoff
  1. waiters ← 3, guardLimit ← 2, acquired ← 1, action ← page

    1fun main() {2    val waiters→ 3 = 33    val guardLimit→ 2 = 24    val acquired→ 1 = 156    val action→ page = if (waiters3 == 0) {7        "enter"8    } else if (waiters3 <= guardLimit2) {9        "backoff"10    } else {11        "page"12    }1314    println("waiters=$waiters3 acquired=$acquired1 $actionpage")15}
    outputwaiters=3 acquired=1 page