lib/sync: Add option for sasha-s/go-deadlock

This commit is contained in:
Audrius Butkevicius
2016-11-05 02:24:53 +00:00
parent 14937e7dd2
commit da413b823b
7 changed files with 847 additions and 56 deletions

View File

@@ -13,6 +13,7 @@ import (
"time"
"github.com/syncthing/syncthing/lib/logger"
"github.com/sasha-s/go-deadlock"
)
var (
@@ -22,14 +23,15 @@ var (
// We make an exception in this package and have an actual "if debug { ...
// }" variable, as it may be rather performance critical and does
// nonstandard things (from a debug logging PoV).
debug = strings.Contains(os.Getenv("STTRACE"), "sync") || os.Getenv("STTRACE") == "all"
debug = strings.Contains(os.Getenv("STTRACE"), "sync") || os.Getenv("STTRACE") == "all"
useDeadlock = os.Getenv("STDEADLOCK") != ""
)
func init() {
l.SetDebug("sync", strings.Contains(os.Getenv("STTRACE"), "sync") || os.Getenv("STTRACE") == "all")
if n, err := strconv.Atoi(os.Getenv("STLOCKTHRESHOLD")); err == nil {
threshold = time.Duration(n) * time.Millisecond
deadlock.Opts.DeadlockTimeout = threshold = time.Duration(n) * time.Millisecond
}
l.Debugf("Enabling lock logging at %v threshold", threshold)
}

View File

@@ -15,6 +15,8 @@ import (
"sync"
"sync/atomic"
"time"
"github.com/sasha-s/go-deadlock"
)
type Mutex interface {
@@ -35,6 +37,9 @@ type WaitGroup interface {
}
func NewMutex() Mutex {
if useDeadlock {
return deadlock.Mutex{}
}
if debug {
mutex := &loggedMutex{}
mutex.holder.Store(holder{})
@@ -44,6 +49,9 @@ func NewMutex() Mutex {
}
func NewRWMutex() RWMutex {
if useDeadlock {
return deadlock.RWMutex{}
}
if debug {
mutex := &loggedRWMutex{
readHolders: make(map[int][]holder),