Browse Source

Lock tracing, fixes

Jakob Borg 12 years ago
parent
commit
cf04e101b9
2 changed files with 46 additions and 9 deletions
  1. 43 0
      locktrace.go
  2. 3 9
      model.go

+ 43 - 0
locktrace.go

@@ -0,0 +1,43 @@
+//+build locktrace
+
+package main
+
+import (
+	"log"
+	"path"
+	"runtime"
+	"time"
+)
+
+var (
+	lockTime time.Time
+)
+
+func (m *Model) Lock() {
+	_, file, line, _ := runtime.Caller(1)
+	log.Printf("%s:%d: Lock()...", path.Base(file), line)
+	blockTime := time.Now()
+	m.RWMutex.Lock()
+	lockTime = time.Now()
+	log.Printf("%s:%d: ...Lock() [%.04f ms]", path.Base(file), line, time.Since(blockTime).Seconds()*1000)
+}
+
+func (m *Model) Unlock() {
+	_, file, line, _ := runtime.Caller(1)
+	m.RWMutex.Unlock()
+	log.Printf("%s:%d: Unlock() [%.04f ms]", path.Base(file), line, time.Since(lockTime).Seconds()*1000)
+}
+
+func (m *Model) RLock() {
+	_, file, line, _ := runtime.Caller(1)
+	log.Printf("%s:%d: RLock()...", path.Base(file), line)
+	blockTime := time.Now()
+	m.RWMutex.RLock()
+	log.Printf("%s:%d: ...RLock() [%.04f ms]", path.Base(file), line, time.Since(blockTime).Seconds()*1000)
+}
+
+func (m *Model) RUnlock() {
+	_, file, line, _ := runtime.Caller(1)
+	m.RWMutex.RUnlock()
+	log.Printf("%s:%d: RUnlock()", path.Base(file), line)
+}

+ 3 - 9
model.go

@@ -233,16 +233,10 @@ func (m *Model) ReplaceLocal(fs []File) {
 		m.recomputeGlobal()
 		m.recomputeNeed()
 		m.updated = time.Now().Unix()
-		m.broadcastIndex()
+		m.lastIdxBcastRequest = time.Now()
 	}
 }
 
-func (m *Model) broadcastIndex() {
-	m.Lock()
-	defer m.Unlock()
-	m.lastIdxBcastRequest = time.Now()
-}
-
 func (m *Model) broadcastIndexLoop() {
 	for {
 		m.RLock()
@@ -263,7 +257,7 @@ func (m *Model) broadcastIndexLoop() {
 			m.lastIdxBcast = time.Now()
 		}
 		m.RUnlock()
-		time.Sleep(idxBcastHoldtime)
+		time.Sleep(idxBcastHoldtime / 2)
 	}
 }
 
@@ -300,7 +294,7 @@ func (m *Model) UpdateLocal(f File) {
 		m.recomputeGlobal()
 		m.recomputeNeed()
 		m.updated = time.Now().Unix()
-		m.broadcastIndex()
+		m.lastIdxBcastRequest = time.Now()
 	}
 }