locktrace.go 1010 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. //+build locktrace
  2. package main
  3. import (
  4. "log"
  5. "path"
  6. "runtime"
  7. "time"
  8. )
  9. var (
  10. lockTime time.Time
  11. )
  12. func (m *Model) Lock() {
  13. _, file, line, _ := runtime.Caller(1)
  14. log.Printf("%s:%d: Lock()...", path.Base(file), line)
  15. blockTime := time.Now()
  16. m.RWMutex.Lock()
  17. lockTime = time.Now()
  18. log.Printf("%s:%d: ...Lock() [%.04f ms]", path.Base(file), line, time.Since(blockTime).Seconds()*1000)
  19. }
  20. func (m *Model) Unlock() {
  21. _, file, line, _ := runtime.Caller(1)
  22. m.RWMutex.Unlock()
  23. log.Printf("%s:%d: Unlock() [%.04f ms]", path.Base(file), line, time.Since(lockTime).Seconds()*1000)
  24. }
  25. func (m *Model) RLock() {
  26. _, file, line, _ := runtime.Caller(1)
  27. log.Printf("%s:%d: RLock()...", path.Base(file), line)
  28. blockTime := time.Now()
  29. m.RWMutex.RLock()
  30. log.Printf("%s:%d: ...RLock() [%.04f ms]", path.Base(file), line, time.Since(blockTime).Seconds()*1000)
  31. }
  32. func (m *Model) RUnlock() {
  33. _, file, line, _ := runtime.Caller(1)
  34. m.RWMutex.RUnlock()
  35. log.Printf("%s:%d: RUnlock()", path.Base(file), line)
  36. }