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 scheduler timing or lock identity.

Mutex Guard Remediation Report

waiters
mutex_guard_remediation_report.go
Replay: real traced execution (multi-file project)
package main

import "fmt"

func main() {
	var waiters = 0
	guardLimit := 2
	acquired := 1
	var action string
	if waiters == 0 {
		action = "enter"
	} else if waiters <= guardLimit {
		action = "backoff"
	} else {
		action = "page"
	}
	fmt.Printf("waiters=%d acquired=%d %s\n", waiters, acquired, action)
}
package main

import "fmt"

func main() {
	var waiters = 1
	guardLimit := 2
	acquired := 1
	var action string
	if waiters == 0 {
		action = "enter"
	} else if waiters <= guardLimit {
		action = "backoff"
	} else {
		action = "page"
	}
	fmt.Printf("waiters=%d acquired=%d %s\n", waiters, acquired, action)
}
package main

import "fmt"

func main() {
	var waiters = 3
	guardLimit := 2
	acquired := 1
	var action string
	if waiters == 0 {
		action = "enter"
	} else if waiters <= guardLimit {
		action = "backoff"
	} else {
		action = "page"
	}
	fmt.Printf("waiters=%d acquired=%d %s\n", waiters, acquired, action)
}
  1. waiters ← 0, guardLimit ← 2, acquired ← 1, action ← ""

    5func main() {6  var waiters→ 0 = 0 //@waiters=1, 37  guardLimit→ 2 := 28  acquired→ 1 := 19  var action→ "" string10  if waiters == 0 {
  2. action ← "enter"

    9var action string10if waiters0 == 0 {11  action→ "enter" = "enter"12} else if waiters <= guardLimit {
  3. fmt.Printf("waiters=%d acquired=%d %s ", waiters, acquired, action)

    16  }17  fmt.Printf("waiters=%d acquired=%d %s\n", waiters0, acquired1, action"enter")18}
    outputwaiters=0 acquired=1 enter
  1. waiters ← 1, guardLimit ← 2, acquired ← 1, action ← ""

    5func main() {6  var waiters→ 1 = 17  guardLimit→ 2 := 28  acquired→ 1 := 19  var action→ "" string10  if waiters == 0 {
  2. action ← "backoff"

    11  action = "enter"12} else if waiters1 <= guardLimit2 {13  action→ "backoff" = "backoff"14} else {
  3. fmt.Printf("waiters=%d acquired=%d %s ", waiters, acquired, action)

    16  }17  fmt.Printf("waiters=%d acquired=%d %s\n", waiters1, acquired1, action"backoff")18}
    outputwaiters=1 acquired=1 backoff
  1. waiters ← 3, guardLimit ← 2, acquired ← 1, action ← ""

    5func main() {6  var waiters→ 3 = 37  guardLimit→ 2 := 28  acquired→ 1 := 19  var action→ "" string10  if waiters == 0 {
  2. action ← "page"

    13  action = "backoff"14} else {15  action→ "page" = "page"16}
  3. fmt.Printf("waiters=%d acquired=%d %s ", waiters, acquired, action)

    16  }17  fmt.Printf("waiters=%d acquired=%d %s\n", waiters3, acquired1, action"page")18}
    outputwaiters=3 acquired=1 page