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.scala
Replay: real traced execution (multi-file project)
object Main {
  def main(args: Array[String]): Unit = {
    val waiters = 0
    val guardLimit = 2
    val acquired = 1

    var action = "enter"
    if (waiters >= 1 && waiters <= guardLimit) {
      action = "backoff"
    }
    if (waiters > guardLimit) {
      action = "page"
    }

    println("waiters=" + waiters + " acquired=" + acquired + " " + action)
  }
}
object Main {
  def main(args: Array[String]): Unit = {
    val waiters = 1
    val guardLimit = 2
    val acquired = 1

    var action = "enter"
    if (waiters >= 1 && waiters <= guardLimit) {
      action = "backoff"
    }
    if (waiters > guardLimit) {
      action = "page"
    }

    println("waiters=" + waiters + " acquired=" + acquired + " " + action)
  }
}
object Main {
  def main(args: Array[String]): Unit = {
    val waiters = 3
    val guardLimit = 2
    val acquired = 1

    var action = "enter"
    if (waiters >= 1 && waiters <= guardLimit) {
      action = "backoff"
    }
    if (waiters > guardLimit) {
      action = "page"
    }

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

    1object Main {2  def main(args: Array[String]): Unit = {3    val waiters→ 0 = 0 //@waiters=1, 34    val guardLimit→ 2 = 25    val acquired→ 1 = 167    var action→ enter = "enter"8    if (waiters >= 1 && waiters <= guardLimit) {9      action = "backoff"10    }11    if (waiters > guardLimit) {12      action = "page"13    }1415    println("waiters=" + waiters0 + " acquired=" + acquired1 + " " + actionenter)16  }17}
    outputwaiters=0 acquired=1 enter
  1. waiters ← 1, guardLimit ← 2, acquired ← 1, action ← enter

    1object Main {2  def main(args: Array[String]): Unit = {3    val waiters→ 1 = 14    val guardLimit→ 2 = 25    val acquired→ 1 = 167    var action→ enter = "enter"8    if (waiters >= 1 && waiters <= guardLimit) {9      action = "backoff"
  2. action ← backoff

    7var action = "enter"8if (waiters1 >= 1 && waiters <= guardLimit2) {9  action→ backoff = "backoff"10}11if (waiters > guardLimit) {
  3. println("waiters=" + waiters + " acquired=" + acquired + " " + action)

    15    println("waiters=" + waiters1 + " acquired=" + acquired1 + " " + actionbackoff)16  }17}
    outputwaiters=1 acquired=1 backoff
  1. waiters ← 3, guardLimit ← 2, acquired ← 1, action ← enter

    1object Main {2  def main(args: Array[String]): Unit = {3    val waiters→ 3 = 34    val guardLimit→ 2 = 25    val acquired→ 1 = 167    var action→ enter = "enter"8    if (waiters >= 1 && waiters <= guardLimit) {9      action = "backoff"
  2. action ← page

    10}11if (waiters3 > guardLimit2) {12  action→ page = "page"13}
  3. println("waiters=" + waiters + " acquired=" + acquired + " " + action)

    15    println("waiters=" + waiters3 + " acquired=" + acquired1 + " " + actionpage)16  }17}
    outputwaiters=3 acquired=1 page