Record nonblocking lock attempts and report whether a later attempt was blocked.

nonblocking acquire A coordination report records nonblocking lock attempts. `sync.Mutex.TryLock` returns true when it takes the lock and false when the lock is already held, so it never blocks. Each acquired lock stays held, so a later attempt in the same run is reported as blocked and the status line summarizes whether the section stayed idle, guarded, or blocked a later acquire.

Mutex Try-Lock Coordination Report

holds
mutex_trylock_coordination_report.go
Replay: real traced execution (multi-file project)
package main

import (
	"fmt"
	"sync"
)

func main() {
	var holds = 1
	var lock sync.Mutex
	acquired := 0
	blocked := 0
	for i := 0; i < holds; i++ {
		ok := lock.TryLock()
		if ok {
			acquired++
		} else {
			blocked++
		}
	}
	var status string
	if acquired == 0 {
		status = "idle"
	} else if blocked > 0 {
		status = "blocked"
	} else {
		status = "guarded"
	}
	fmt.Printf("holds=%d acquired=%d blocked=%d %s\n", holds, acquired, blocked, status)
}
package main

import (
	"fmt"
	"sync"
)

func main() {
	var holds = 0
	var lock sync.Mutex
	acquired := 0
	blocked := 0
	for i := 0; i < holds; i++ {
		ok := lock.TryLock()
		if ok {
			acquired++
		} else {
			blocked++
		}
	}
	var status string
	if acquired == 0 {
		status = "idle"
	} else if blocked > 0 {
		status = "blocked"
	} else {
		status = "guarded"
	}
	fmt.Printf("holds=%d acquired=%d blocked=%d %s\n", holds, acquired, blocked, status)
}
package main

import (
	"fmt"
	"sync"
)

func main() {
	var holds = 2
	var lock sync.Mutex
	acquired := 0
	blocked := 0
	for i := 0; i < holds; i++ {
		ok := lock.TryLock()
		if ok {
			acquired++
		} else {
			blocked++
		}
	}
	var status string
	if acquired == 0 {
		status = "idle"
	} else if blocked > 0 {
		status = "blocked"
	} else {
		status = "guarded"
	}
	fmt.Printf("holds=%d acquired=%d blocked=%d %s\n", holds, acquired, blocked, status)
}
  1. holds ← 1, lock ← sync.Mutex{state:0, sema:0x0}, acquired ← 0

    8func main() {9  var holds→ 1 = 1 //@holds=0, 210  var lock→ sync.Mutex{state:0, sema:0x0} sync.Mutex11  acquired→ 0 := 012  blocked→ 0 := 013  for i := 0; i < holds; i++ {
  2. lock ← sync.Mutex{state:1, sema:0x0}, ok ← true

    12blocked := 013for i0 := 0; i < holds1; i++ {14  ok→ true := lock→ sync.Mutex{state:1, sema:0x0}.TryLock()15  if ok {
  3. acquired ← 1

    14ok := lock.TryLock()15if oktrue {16  acquired→ 1++17} else {
  4. status ← ""

    20}21var status→ "" string22if acquired == 0 {
  5. status ← "guarded"

    25  status = "blocked"26} else {27  status→ "guarded" = "guarded"28}
  6. fmt.Printf("holds=%d acquired=%d blocked=%d %s ", holds, acquired, blo…

    28  }29  fmt.Printf("holds=%d acquired=%d blocked=%d %s\n", holds1, acquired1, blocked0, status"guarded")30}
    outputholds=1 acquired=1 blocked=0 guarded
  1. holds ← 0, lock ← sync.Mutex{state:0, sema:0x0}, acquired ← 0

    8func main() {9  var holds→ 0 = 010  var lock→ sync.Mutex{state:0, sema:0x0} sync.Mutex11  acquired→ 0 := 012  blocked→ 0 := 013  for i := 0; i < holds; i++ {14    ok := lock.TryLock()15    if ok {16      acquired++17    } else {18      blocked++19    }20  }21  var status→ "" string22  if acquired == 0 {
  2. status ← "idle"

    21var status string22if acquired0 == 0 {23  status→ "idle" = "idle"24} else if blocked > 0 {
  3. fmt.Printf("holds=%d acquired=%d blocked=%d %s ", holds, acquired, blo…

    28  }29  fmt.Printf("holds=%d acquired=%d blocked=%d %s\n", holds0, acquired0, blocked0, status"idle")30}
    outputholds=0 acquired=0 blocked=0 idle
  1. holds ← 2, lock ← sync.Mutex{state:0, sema:0x0}, acquired ← 0

    8func main() {9  var holds→ 2 = 210  var lock→ sync.Mutex{state:0, sema:0x0} sync.Mutex11  acquired→ 0 := 012  blocked→ 0 := 013  for i := 0; i < holds; i++ {
  2. lock ← sync.Mutex{state:1, sema:0x0}, ok ← true

    pass 1 of 2
    12blocked := 013for i0 := 0; i < holds2; i++ {14  ok→ true := lock→ sync.Mutex{state:1, sema:0x0}.TryLock()15  if ok {
  3. acquired ← 1

    14ok := lock.TryLock()15if oktrue {16  acquired→ 1++17} else {
  4. ok ← false

    pass 2 of 2
    12blocked := 013for i1 := 0; i < holds2; i++ {14  ok→ false := locksync.Mutex{state:1, sema:0x0}.TryLock()15  if ok {
  5. blocked ← 1

    16  acquired++17} else {18  blocked→ 1++19}
  6. status ← ""

    20}21var status→ "" string22if acquired == 0 {
  7. status ← "blocked"

    23  status = "idle"24} else if blocked1 > 0 {25  status→ "blocked" = "blocked"26} else {
  8. fmt.Printf("holds=%d acquired=%d blocked=%d %s ", holds, acquired, blo…

    28  }29  fmt.Printf("holds=%d acquired=%d blocked=%d %s\n", holds2, acquired1, blocked1, status"blocked")30}
    outputholds=2 acquired=1 blocked=1 blocked