summaryrefslogtreecommitdiff
path: root/internal/log/caller.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/log/caller.go')
-rw-r--r--internal/log/caller.go74
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
}