diff options
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/api/s2s/user/inboxpost_test.go | 9 | ||||
| -rw-r--r-- | internal/log/caller.go | 74 | ||||
| -rw-r--r-- | internal/log/caller_test.go | 54 | 
3 files changed, 22 insertions, 115 deletions
diff --git a/internal/api/s2s/user/inboxpost_test.go b/internal/api/s2s/user/inboxpost_test.go index 90783406f..a408b3773 100644 --- a/internal/api/s2s/user/inboxpost_test.go +++ b/internal/api/s2s/user/inboxpost_test.go @@ -292,15 +292,6 @@ func (suite *InboxPostTestSuite) TestPostUpdate() {  	federator := testrig.NewTestFederator(suite.db, tc, suite.storage, suite.mediaManager, fedWorker)  	emailSender := testrig.NewEmailSender("../../../../web/template/", nil)  	processor := testrig.NewTestProcessor(suite.db, suite.storage, federator, emailSender, suite.mediaManager, clientWorker, fedWorker) -	if err := processor.Start(); err != nil { -		panic(err) -	} -	defer func() { -		if err := processor.Stop(); err != nil { -			panic(err) -		} -	}() -  	userModule := user.New(processor).(*user.Module)  	suite.NoError(processor.Start()) 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  } diff --git a/internal/log/caller_test.go b/internal/log/caller_test.go deleted file mode 100644 index 59bf342d1..000000000 --- a/internal/log/caller_test.go +++ /dev/null @@ -1,54 +0,0 @@ -package log_test - -import ( -	"runtime" -	"strings" -	"testing" - -	"codeberg.org/gruf/go-atomics" -	"github.com/superseriousbusiness/gotosocial/internal/log" -) - -// noopt exists to prevent certain optimisations during benching. -var noopt = atomics.NewString() - -func BenchmarkCaller(b *testing.B) { -	b.RunParallel(func(pb *testing.PB) { -		for pb.Next() { -			name := log.Caller(2) -			noopt.Store(name) -		} -	}) -} - -func BenchmarkCallerNoCache(b *testing.B) { -	b.RunParallel(func(pb *testing.PB) { -		for pb.Next() { -			var rpc [1]uintptr - -			// Fetch pcs of callers -			n := runtime.Callers(2, rpc[:]) - -			if n > 0 { -				// Fetch frame info for caller pc -				frame, _ := runtime.CallersFrames(rpc[:]).Next() - -				if frame.PC != 0 { -					name := frame.Function - -					// Drop all but the package name and function name, no mod path -					if idx := strings.LastIndex(name, "/"); idx >= 0 { -						name = name[idx+1:] -					} - -					// Drop any generic type parameter markers -					if idx := strings.Index(name, "[...]"); idx >= 0 { -						name = name[:idx] + name[idx+5:] -					} - -					noopt.Store(name) -				} -			} -		} -	}) -}  | 
