-
Notifications
You must be signed in to change notification settings - Fork 0
/
opts.go
58 lines (49 loc) · 1.16 KB
/
opts.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package deadlock
import (
"fmt"
"os"
"strings"
)
type (
DeadlockInfo struct {
stack string
lockPath []string
}
OnDeadlockFunc func(deadlockType int, infos []DeadlockInfo)
Options struct {
CheckDeadLock bool
OnDeadlock OnDeadlockFunc
}
)
var (
opts = Options{
CheckDeadLock: false,
OnDeadlock: defaultOnDeadlock,
}
)
func SetOptions(o Options) {
if !o.CheckDeadLock {
return
}
opts.CheckDeadLock = true
if o.OnDeadlock != nil {
opts.OnDeadlock = o.OnDeadlock
}
lockDataMutex.Lock()
lockDataMap = map[int]*lockData{}
lockDataMutex.Unlock()
}
func defaultOnDeadlock(typ int, infos []DeadlockInfo) {
fmt.Println(DefaultDeadlockInfoString(typ, infos))
os.Exit(-1)
}
func DefaultDeadlockInfoString(typ int, infos []DeadlockInfo) string {
builder := strings.Builder{}
builder.WriteString(fmt.Sprintf("deadlockType:%d\n", typ))
for i, info := range infos {
builder.WriteString(fmt.Sprintf("#################goroutine %d info#################\n", i))
builder.WriteString(fmt.Sprintf("lockPath:\n%s\n", strings.Join(info.lockPath, "\n")))
builder.WriteString(fmt.Sprintf("stack:\n%s\n", info.stack))
}
return builder.String()
}