Concurrency Coordination Reports
Mutex Try-Lock Coordination Report
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
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)
}
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++ {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 {acquired ← 1
14ok := lock.TryLock()15if oktrue {16 acquired→ 1++17} else {status ← ""
20}21var status→ "" string22if acquired == 0 {status ← "guarded"
25 status = "blocked"26} else {27 status→ "guarded" = "guarded"28}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
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 {status ← "idle"
21var status string22if acquired0 == 0 {23 status→ "idle" = "idle"24} else if blocked > 0 {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
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++ {lock ← sync.Mutex{state:1, sema:0x0}, ok ← true
pass 1 of 212blocked := 013for i0 := 0; i < holds2; i++ {14 ok→ true := lock→ sync.Mutex{state:1, sema:0x0}.TryLock()15 if ok {acquired ← 1
14ok := lock.TryLock()15if oktrue {16 acquired→ 1++17} else {ok ← false
pass 2 of 212blocked := 013for i1 := 0; i < holds2; i++ {14 ok→ false := locksync.Mutex{state:1, sema:0x0}.TryLock()15 if ok {blocked ← 1
16 acquired++17} else {18 blocked→ 1++19}status ← ""
20}21var status→ "" string22if acquired == 0 {status ← "blocked"
23 status = "idle"24} else if blocked1 > 0 {25 status→ "blocked" = "blocked"26} else {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