diff options
Diffstat (limited to 'internal/log/caller.go')
-rw-r--r-- | internal/log/caller.go | 74 |
1 files changed, 22 insertions, 52 deletions
diff --git a/internal/log/caller.go b/internal/log/caller.go index f7062f06a..14a639b51 100644 --- a/internal/log/caller.go +++ b/internal/log/caller.go @@ -21,69 +21,39 @@ package log import ( "runtime" "strings" - "sync" -) - -var ( - // fnCache is a cache of PCs to their calculated function names. - fnCache = map[uintptr]string{} - - // strCache is a cache of strings to the originally allocated version - // of that string contents. so we don't have hundreds of the same instances - // of string floating around in memory. - strCache = map[string]string{} - - // cacheMu protects fnCache and strCache. - cacheMu sync.Mutex ) // Caller fetches the calling function name, skipping 'depth'. Results are cached per PC. func Caller(depth int) string { - var rpc [1]uintptr - - // Fetch pcs of callers - n := runtime.Callers(depth, rpc[:]) + var pcs [1]uintptr - if n > 0 { - // Look for value in cache - cacheMu.Lock() - fn, ok := fnCache[rpc[0]] - cacheMu.Unlock() + // Fetch calling function using calldepth + _ = runtime.Callers(depth, pcs[:]) + fn := runtime.FuncForPC(pcs[0]) - if ok { - return fn - } - - // Fetch frame info for caller pc - frame, _ := runtime.CallersFrames(rpc[:]).Next() + if fn == nil { + return "" + } - if frame.PC != 0 { - name := frame.Function + // return formatted name + return callername(fn) +} - // Drop all but the package name and function name, no mod path - if idx := strings.LastIndex(name, "/"); idx >= 0 { - name = name[idx+1:] - } +// callername generates a human-readable calling function name. +func callername(fn *runtime.Func) string { + name := fn.Name() - // Drop any generic type parameter markers - if idx := strings.Index(name, "[...]"); idx >= 0 { - name = name[:idx] + name[idx+5:] - } + // Drop all but the package name and function name, no mod path + if idx := strings.LastIndex(name, "/"); idx >= 0 { + name = name[idx+1:] + } - // Cache this func name - cacheMu.Lock() - fn, ok := strCache[name] - if !ok { - // Cache ptr to this allocated str - strCache[name] = name - fn = name - } - fnCache[rpc[0]] = fn - cacheMu.Unlock() + const params = `[...]` - return fn - } + // Drop any generic type parameter markers + if idx := strings.Index(name, params); idx >= 0 { + name = name[:idx] + name[idx+len(params):] } - return "???" + return name } |