Record compare-and-set claims against a single slot and report the contention.

compare-and-set claim A coordination report can record a single-winner claim. An `AtomicInteger` starts at zero for unclaimed, and `compareAndSet(0, id)` only succeeds for the first request, which writes its id into the slot; every later request reads a nonzero owner and is rejected. With no requests the slot is open, with one request it is claimed, and with competing requests it is contended. The status line summarizes the outcome and reports the winning owner id.

Atomic Claim Coordination Report

requests
AtomicClaimCoordinationReport.scala
Replay: real traced execution (multi-file project)
import java.util.concurrent.atomic.AtomicInteger

object Main {
  def main(args: Array[String]): Unit = {
    val requests = 1
    val slot = new AtomicInteger(0)
    var claimed = 0
    var rejected = 0

    for (i <- 1 to requests) {
      if (slot.compareAndSet(0, i)) {
        claimed = claimed + 1
      } else {
        rejected = rejected + 1
      }
    }

    val owner = slot.get()

    var status = "claimed"
    if (claimed == 0) {
      status = "open"
    }
    if (rejected > 0) {
      status = "contended"
    }

    println("requests=" + requests + " claimed=" + claimed + " rejected=" + rejected + " owner=" + owner + " " + status)
  }
}
import java.util.concurrent.atomic.AtomicInteger

object Main {
  def main(args: Array[String]): Unit = {
    val requests = 0
    val slot = new AtomicInteger(0)
    var claimed = 0
    var rejected = 0

    for (i <- 1 to requests) {
      if (slot.compareAndSet(0, i)) {
        claimed = claimed + 1
      } else {
        rejected = rejected + 1
      }
    }

    val owner = slot.get()

    var status = "claimed"
    if (claimed == 0) {
      status = "open"
    }
    if (rejected > 0) {
      status = "contended"
    }

    println("requests=" + requests + " claimed=" + claimed + " rejected=" + rejected + " owner=" + owner + " " + status)
  }
}
import java.util.concurrent.atomic.AtomicInteger

object Main {
  def main(args: Array[String]): Unit = {
    val requests = 2
    val slot = new AtomicInteger(0)
    var claimed = 0
    var rejected = 0

    for (i <- 1 to requests) {
      if (slot.compareAndSet(0, i)) {
        claimed = claimed + 1
      } else {
        rejected = rejected + 1
      }
    }

    val owner = slot.get()

    var status = "claimed"
    if (claimed == 0) {
      status = "open"
    }
    if (rejected > 0) {
      status = "contended"
    }

    println("requests=" + requests + " claimed=" + claimed + " rejected=" + rejected + " owner=" + owner + " " + status)
  }
}
  1. requests ← 1, slot ← 0, claimed ← 0, rejected ← 0

    3object Main {4  def main(args: Array[String]): Unit = {5    val requests→ 1 = 1 //@requests=0, 26    val slot→ 0 = new AtomicInteger(0)7    var claimed→ 0 = 08    var rejected→ 0 = 0910    for (i <- 1 to requests) {
  2. for (i <- 1 to requests)

    10for (i1 <- 1 to requests1) {11  if (slot.compareAndSet(0, i)) {
  3. claimed ← 1

    10for (i <- 1 to requests) {11  if (slot1.compareAndSet(0, i1)) {12    claimed→ 1 = claimed + 113  } else {14    rejected = rejected + 1
  4. owner ← 1, status ← claimed

    18    val owner→ 1 = slot1.get()1920    var status→ claimed = "claimed"21    if (claimed == 0) {22      status = "open"23    }24    if (rejected > 0) {25      status = "contended"26    }2728    println("requests=" + requests1 + " claimed=" + claimed1 + " rejected=" + rejected0 + " owner=" + owner1 + " " + statusclaimed)29  }30}
    outputrequests=1 claimed=1 rejected=0 owner=1 claimed
  1. requests ← 0, slot ← 0, claimed ← 0, rejected ← 0, owner ← 0, status ← claimed

    3object Main {4  def main(args: Array[String]): Unit = {5    val requests→ 0 = 06    val slot→ 0 = new AtomicInteger(0)7    var claimed→ 0 = 08    var rejected→ 0 = 0910    for (i <- 1 to requests) {11      if (slot.compareAndSet(0, i)) {12        claimed = claimed + 113      } else {14        rejected = rejected + 115      }16    }1718    val owner→ 0 = slot0.get()1920    var status→ claimed = "claimed"21    if (claimed == 0) {22      status = "open"
  2. status ← open

    20var status = "claimed"21if (claimed0 == 0) {22  status→ open = "open"23}24if (rejected > 0) {
  3. println("requests=" + requests + " claimed=" + claimed + " rejected=" …

    28    println("requests=" + requests0 + " claimed=" + claimed0 + " rejected=" + rejected0 + " owner=" + owner0 + " " + statusopen)29  }30}
    outputrequests=0 claimed=0 rejected=0 owner=0 open
  1. requests ← 2, slot ← 0, claimed ← 0, rejected ← 0

    3object Main {4  def main(args: Array[String]): Unit = {5    val requests→ 2 = 26    val slot→ 0 = new AtomicInteger(0)7    var claimed→ 0 = 08    var rejected→ 0 = 0910    for (i <- 1 to requests) {
  2. for (i <- 1 to requests)

    pass 1 of 2
    10for (i1 <- 1 to requests2) {11  if (slot.compareAndSet(0, i)) {
  3. claimed ← 1

    10for (i <- 1 to requests) {11  if (slot1.compareAndSet(0, i1)) {12    claimed→ 1 = claimed + 113  } else {14    rejected = rejected + 1
  4. for (i <- 1 to requests)

    pass 2 of 2
    10for (i2 <- 1 to requests2) {11  if (slot.compareAndSet(0, i)) {
  5. rejected ← 1

    12    claimed = claimed + 113  } else {14    rejected→ 1 = rejected + 115  }16}
  6. owner ← 1, status ← claimed

    18val owner→ 1 = slot1.get()1920var status→ claimed = "claimed"21if (claimed == 0) {22  status = "open"
  7. status ← contended

    23}24if (rejected1 > 0) {25  status→ contended = "contended"26}
  8. println("requests=" + requests + " claimed=" + claimed + " rejected=" …

    28    println("requests=" + requests2 + " claimed=" + claimed1 + " rejected=" + rejected1 + " owner=" + owner1 + " " + statuscontended)29  }30}
    outputrequests=2 claimed=1 rejected=1 owner=1 contended