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.kt
Replay: real traced execution (multi-file project)
fun main() {
    val arrivals = 3
    val needed = 3
    var counted = arrivals
    if (counted > needed) {
        counted = needed
    }
    val remaining = needed - counted

    val action = if (remaining == 0) {
        "release"
    } else if (remaining <= 1) {
        "wait"
    } else {
        "escalate"
    }

    println("needed=$needed counted=$counted remaining=$remaining $action")
}
fun main() {
    val arrivals = 0
    val needed = 3
    var counted = arrivals
    if (counted > needed) {
        counted = needed
    }
    val remaining = needed - counted

    val action = if (remaining == 0) {
        "release"
    } else if (remaining <= 1) {
        "wait"
    } else {
        "escalate"
    }

    println("needed=$needed counted=$counted remaining=$remaining $action")
}
fun main() {
    val arrivals = 2
    val needed = 3
    var counted = arrivals
    if (counted > needed) {
        counted = needed
    }
    val remaining = needed - counted

    val action = if (remaining == 0) {
        "release"
    } else if (remaining <= 1) {
        "wait"
    } else {
        "escalate"
    }

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

    1fun main() {2    val arrivals→ 3 = 3 //@arrivals=2, 03    val needed→ 3 = 34    var counted→ 3 = arrivals35    if (counted > needed) {6        counted = needed7    }8    val remaining→ 0 = needed3 - counted3910    val action→ release = if (remaining0 == 0) {11        "release"12    } else if (remaining0 <= 1) {13        "wait"14    } else {15        "escalate"16    }1718    println("needed=$needed3 counted=$counted3 remaining=$remaining0 $actionrelease")19}
    outputneeded=3 counted=3 remaining=0 release
  1. arrivals ← 0, needed ← 3, counted ← 0, remaining ← 3, action ← escalate

    1fun main() {2    val arrivals→ 0 = 03    val needed→ 3 = 34    var counted→ 0 = arrivals05    if (counted > needed) {6        counted = needed7    }8    val remaining→ 3 = needed3 - counted0910    val action→ escalate = if (remaining3 == 0) {11        "release"12    } else if (remaining3 <= 1) {13        "wait"14    } else {15        "escalate"16    }1718    println("needed=$needed3 counted=$counted0 remaining=$remaining3 $actionescalate")19}
    outputneeded=3 counted=0 remaining=3 escalate
  1. arrivals ← 2, needed ← 3, counted ← 2, remaining ← 1, action ← wait

    1fun main() {2    val arrivals→ 2 = 23    val needed→ 3 = 34    var counted→ 2 = arrivals25    if (counted > needed) {6        counted = needed7    }8    val remaining→ 1 = needed3 - counted2910    val action→ wait = if (remaining1 == 0) {11        "release"12    } else if (remaining1 <= 1) {13        "wait"14    } else {15        "escalate"16    }1718    println("needed=$needed3 counted=$counted2 remaining=$remaining1 $actionwait")19}
    outputneeded=3 counted=2 remaining=1 wait