Admit concurrent readers against a fixed capacity and turn the remaining read slots into an admit, hold, or shed remediation action.

read admission The reader admission is modeled with a scalar capacity counter, so the remaining slots stay deterministic and free of lock identity while driving the remediation action.

RWMutex Read Remediation Report

readers
rwmutex_read_remediation_report.go
Replay: real traced execution (multi-file project)
package main

import "fmt"

func main() {
	var readers = 1
	capacity := 3
	admitted := readers
	if admitted > capacity {
		admitted = capacity
	}
	remaining := capacity - admitted
	var action string
	if remaining >= 2 {
		action = "admit"
	} else if remaining == 1 {
		action = "hold"
	} else {
		action = "shed"
	}
	fmt.Printf("readers=%d admitted=%d remaining=%d %s\n", readers, admitted, remaining, action)
}
package main

import "fmt"

func main() {
	var readers = 2
	capacity := 3
	admitted := readers
	if admitted > capacity {
		admitted = capacity
	}
	remaining := capacity - admitted
	var action string
	if remaining >= 2 {
		action = "admit"
	} else if remaining == 1 {
		action = "hold"
	} else {
		action = "shed"
	}
	fmt.Printf("readers=%d admitted=%d remaining=%d %s\n", readers, admitted, remaining, action)
}
package main

import "fmt"

func main() {
	var readers = 4
	capacity := 3
	admitted := readers
	if admitted > capacity {
		admitted = capacity
	}
	remaining := capacity - admitted
	var action string
	if remaining >= 2 {
		action = "admit"
	} else if remaining == 1 {
		action = "hold"
	} else {
		action = "shed"
	}
	fmt.Printf("readers=%d admitted=%d remaining=%d %s\n", readers, admitted, remaining, action)
}
  1. readers ← 1, capacity ← 3, admitted ← 1, remaining ← 2, action ← ""

    5func main() {6  var readers→ 1 = 1 //@readers=2, 47  capacity→ 3 := 38  admitted→ 1 := readers19  if admitted > capacity {10    admitted = capacity11  }12  remaining→ 2 := capacity3 - admitted113  var action→ "" string14  if remaining >= 2 {
  2. action ← "admit"

    13var action string14if remaining2 >= 2 {15  action→ "admit" = "admit"16} else if remaining == 1 {
  3. fmt.Printf("readers=%d admitted=%d remaining=%d %s ", readers, admitte…

    20  }21  fmt.Printf("readers=%d admitted=%d remaining=%d %s\n", readers1, admitted1, remaining2, action"admit")22}
    outputreaders=1 admitted=1 remaining=2 admit
  1. readers ← 2, capacity ← 3, admitted ← 2, remaining ← 1, action ← ""

    5func main() {6  var readers→ 2 = 27  capacity→ 3 := 38  admitted→ 2 := readers29  if admitted > capacity {10    admitted = capacity11  }12  remaining→ 1 := capacity3 - admitted213  var action→ "" string14  if remaining >= 2 {
  2. action ← "hold"

    15  action = "admit"16} else if remaining1 == 1 {17  action→ "hold" = "hold"18} else {
  3. fmt.Printf("readers=%d admitted=%d remaining=%d %s ", readers, admitte…

    20  }21  fmt.Printf("readers=%d admitted=%d remaining=%d %s\n", readers2, admitted2, remaining1, action"hold")22}
    outputreaders=2 admitted=2 remaining=1 hold
  1. readers ← 4, capacity ← 3, admitted ← 4

    5func main() {6  var readers→ 4 = 47  capacity→ 3 := 38  admitted→ 4 := readers49  if admitted > capacity {
  2. admitted ← 3

    8admitted := readers9if admitted4 > capacity3 {10  admitted→ 3 = capacity311}
  3. remaining ← 0, action ← ""

    11}12remaining→ 0 := capacity3 - admitted313var action→ "" string14if remaining >= 2 {
  4. action ← "shed"

    17  action = "hold"18} else {19  action→ "shed" = "shed"20}
  5. fmt.Printf("readers=%d admitted=%d remaining=%d %s ", readers, admitte…

    20  }21  fmt.Printf("readers=%d admitted=%d remaining=%d %s\n", readers4, admitted3, remaining0, action"shed")22}
    outputreaders=4 admitted=3 remaining=0 shed