Compare arrivals at a latch against the needed count and turn the remaining count into a release, wait, or escalate remediation action.

latch remaining The needed count and arrivals are scalars, so the remaining work that drives the remediation action stays deterministic without awaiting a live latch.

Countdown Latch Remediation Report

arrivals
CountdownLatchRemediationReport.scala
Replay: real traced execution (multi-file project)
object Main {
  def main(args: Array[String]): Unit = {
    val arrivals = 3
    val needed = 3
    var counted = arrivals
    if (counted > needed) {
      counted = needed
    }
    val remaining = needed - counted

    var action = "release"
    if (remaining == 1) {
      action = "wait"
    }
    if (remaining >= 2) {
      action = "escalate"
    }

    println("needed=" + needed + " counted=" + counted + " remaining=" + remaining + " " + action)
  }
}
object Main {
  def main(args: Array[String]): Unit = {
    val arrivals = 0
    val needed = 3
    var counted = arrivals
    if (counted > needed) {
      counted = needed
    }
    val remaining = needed - counted

    var action = "release"
    if (remaining == 1) {
      action = "wait"
    }
    if (remaining >= 2) {
      action = "escalate"
    }

    println("needed=" + needed + " counted=" + counted + " remaining=" + remaining + " " + action)
  }
}
object Main {
  def main(args: Array[String]): Unit = {
    val arrivals = 2
    val needed = 3
    var counted = arrivals
    if (counted > needed) {
      counted = needed
    }
    val remaining = needed - counted

    var action = "release"
    if (remaining == 1) {
      action = "wait"
    }
    if (remaining >= 2) {
      action = "escalate"
    }

    println("needed=" + needed + " counted=" + counted + " remaining=" + remaining + " " + action)
  }
}
  1. arrivals ← 3, needed ← 3, counted ← 3, remaining ← 0, action ← release

    1object Main {2  def main(args: Array[String]): Unit = {3    val arrivals→ 3 = 3 //@arrivals=2, 04    val needed→ 3 = 35    var counted→ 3 = arrivals→ 36    if (counted > needed) {7      counted = needed8    }9    val remaining→ 0 = needed3 - counted31011    var action→ release = "release"12    if (remaining == 1) {13      action = "wait"14    }15    if (remaining >= 2) {16      action = "escalate"17    }1819    println("needed=" + needed3 + " counted=" + counted3 + " remaining=" + remaining0 + " " + actionrelease)20  }21}
    outputneeded=3 counted=3 remaining=0 release
  1. arrivals ← 0, needed ← 3, counted ← 0, remaining ← 3, action ← release

    1object Main {2  def main(args: Array[String]): Unit = {3    val arrivals→ 0 = 04    val needed→ 3 = 35    var counted→ 0 = arrivals→ 06    if (counted > needed) {7      counted = needed8    }9    val remaining→ 3 = needed3 - counted01011    var action→ release = "release"12    if (remaining == 1) {13      action = "wait"
  2. action ← escalate

    14}15if (remaining3 >= 2) {16  action→ escalate = "escalate"17}
  3. println("needed=" + needed + " counted=" + counted + " remaining=" + r…

    19    println("needed=" + needed3 + " counted=" + counted0 + " remaining=" + remaining3 + " " + actionescalate)20  }21}
    outputneeded=3 counted=0 remaining=3 escalate
  1. arrivals ← 2, needed ← 3, counted ← 2, remaining ← 1, action ← release

    1object Main {2  def main(args: Array[String]): Unit = {3    val arrivals→ 2 = 24    val needed→ 3 = 35    var counted→ 2 = arrivals→ 26    if (counted > needed) {7      counted = needed8    }9    val remaining→ 1 = needed3 - counted21011    var action→ release = "release"12    if (remaining == 1) {13      action = "wait"
  2. action ← wait

    11var action = "release"12if (remaining1 == 1) {13  action→ wait = "wait"14}15if (remaining >= 2) {
  3. println("needed=" + needed + " counted=" + counted + " remaining=" + r…

    19    println("needed=" + needed3 + " counted=" + counted2 + " remaining=" + remaining1 + " " + actionwait)20  }21}
    outputneeded=3 counted=2 remaining=1 wait