40 lines
675 B
Go
40 lines
675 B
Go
|
package perf
|
||
|
|
||
|
import (
|
||
|
"runtime"
|
||
|
)
|
||
|
|
||
|
func ScopeTimer(opts ...timerOpt) func() {
|
||
|
t := NewTimer(CallerName(1))
|
||
|
return func() { t.Mark("returned") }
|
||
|
}
|
||
|
|
||
|
func ScopeTimerOk(ok *bool) func() {
|
||
|
t := NewTimer(CallerName(1))
|
||
|
return func() { t.MarkOk(*ok) }
|
||
|
}
|
||
|
|
||
|
func ScopeTimerErr(err *error) func() {
|
||
|
t := NewTimer(CallerName(1))
|
||
|
return func() {
|
||
|
r := recover()
|
||
|
if r != nil {
|
||
|
t.Mark("panic")
|
||
|
panic(r)
|
||
|
}
|
||
|
t.MarkErr(*err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func CallerName(skip int) timerOpt {
|
||
|
return Name(getCallerName(skip))
|
||
|
}
|
||
|
|
||
|
func getCallerName(skip int) string {
|
||
|
var pc [1]uintptr
|
||
|
runtime.Callers(3+skip, pc[:])
|
||
|
fs := runtime.CallersFrames(pc[:])
|
||
|
f, _ := fs.Next()
|
||
|
return f.Func.Name()
|
||
|
}
|