aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorMichael Pratt <mpratt@google.com>2025-03-24 04:24:35 -0400
committerGopher Robot <gobot@golang.org>2025-03-24 20:56:45 -0700
commit4f11f8ff7db476c534b9b1ad8910dcdd8bbcf022 (patch)
tree32d40f0fa1b047a790241b0567caa23494c06a0b /src/runtime
parent9c88db5f1eba68999184bb043a0b339349b81db4 (diff)
downloadgo-4f11f8ff7db476c534b9b1ad8910dcdd8bbcf022.tar.xz
runtime: rename runfinq to runFinalizersAndCleanups
Users see this frame in tracebacks and it serves as a hint that what is running here is a finalizer or cleanup. But runfinq is a rather dense name. We can give it a more obvious name to help users realize what it is. For #73011. Change-Id: I6a6a636ce9a493fd00d4b4c60c23f2b1c96d3568 Reviewed-on: https://go-review.googlesource.com/c/go/+/660296 Auto-Submit: Michael Pratt <mpratt@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Knyszek <mknyszek@google.com>
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/crash_test.go27
-rw-r--r--src/runtime/mfinal.go8
-rw-r--r--src/runtime/pprof/pprof_test.go4
-rw-r--r--src/runtime/traceback.go12
4 files changed, 28 insertions, 23 deletions
diff --git a/src/runtime/crash_test.go b/src/runtime/crash_test.go
index 6585a6f275..8504455088 100644
--- a/src/runtime/crash_test.go
+++ b/src/runtime/crash_test.go
@@ -1102,31 +1102,32 @@ func TestNetpollWaiters(t *testing.T) {
}
}
-// The runtime.runfinq frame should appear in panics, even if runtime frames
-// are normally hidden (GOTRACEBACK=all).
+// The runtime.runFinalizersAndCleanups frame should appear in panics, even if
+// runtime frames are normally hidden (GOTRACEBACK=all).
func TestFinalizerDeadlockPanic(t *testing.T) {
t.Parallel()
output := runTestProg(t, "testprog", "FinalizerDeadlock", "GOTRACEBACK=all", "GO_TEST_FINALIZER_DEADLOCK=panic")
- want := "runtime.runfinq()"
+ want := "runtime.runFinalizersAndCleanups()"
if !strings.Contains(output, want) {
t.Errorf("output does not contain %q:\n%s", want, output)
}
}
-// The runtime.runfinq frame should appear in runtime.Stack, even though
-// runtime frames are normally hidden.
+// The runtime.runFinalizersAndCleanups frame should appear in runtime.Stack,
+// even though runtime frames are normally hidden.
func TestFinalizerDeadlockStack(t *testing.T) {
t.Parallel()
output := runTestProg(t, "testprog", "FinalizerDeadlock", "GO_TEST_FINALIZER_DEADLOCK=stack")
- want := "runtime.runfinq()"
+ want := "runtime.runFinalizersAndCleanups()"
if !strings.Contains(output, want) {
t.Errorf("output does not contain %q:\n%s", want, output)
}
}
-// The runtime.runfinq frame should appear in goroutine profiles.
+// The runtime.runFinalizersAndCleanups frame should appear in goroutine
+// profiles.
func TestFinalizerDeadlockPprofProto(t *testing.T) {
t.Parallel()
output := runTestProg(t, "testprog", "FinalizerDeadlock", "GO_TEST_FINALIZER_DEADLOCK=pprof_proto")
@@ -1139,7 +1140,7 @@ func TestFinalizerDeadlockPprofProto(t *testing.T) {
t.Fatalf("Error parsing proto output: %v", err)
}
- want := "runtime.runfinq"
+ want := "runtime.runFinalizersAndCleanups"
for _, s := range p.Sample {
for _, loc := range s.Location {
for _, line := range loc.Line {
@@ -1154,23 +1155,25 @@ func TestFinalizerDeadlockPprofProto(t *testing.T) {
t.Errorf("Profile does not contain %q:\n%s", want, p)
}
-// The runtime.runfinq frame should appear in goroutine profiles (debug=1).
+// The runtime.runFinalizersAndCleanups frame should appear in goroutine
+// profiles (debug=1).
func TestFinalizerDeadlockPprofDebug1(t *testing.T) {
t.Parallel()
output := runTestProg(t, "testprog", "FinalizerDeadlock", "GO_TEST_FINALIZER_DEADLOCK=pprof_debug1")
- want := "runtime.runfinq+"
+ want := "runtime.runFinalizersAndCleanups+"
if !strings.Contains(output, want) {
t.Errorf("output does not contain %q:\n%s", want, output)
}
}
-// The runtime.runfinq frame should appear in goroutine profiles (debug=2).
+// The runtime.runFinalizersAndCleanups frame should appear in goroutine
+// profiles (debug=2).
func TestFinalizerDeadlockPprofDebug2(t *testing.T) {
t.Parallel()
output := runTestProg(t, "testprog", "FinalizerDeadlock", "GO_TEST_FINALIZER_DEADLOCK=pprof_debug2")
- want := "runtime.runfinq()"
+ want := "runtime.runFinalizersAndCleanups()"
if !strings.Contains(output, want) {
t.Errorf("output does not contain %q:\n%s", want, output)
}
diff --git a/src/runtime/mfinal.go b/src/runtime/mfinal.go
index 05d26e6cd6..281be9cac6 100644
--- a/src/runtime/mfinal.go
+++ b/src/runtime/mfinal.go
@@ -164,7 +164,7 @@ func wakefing() *g {
func createfing() {
// start the finalizer goroutine exactly once
if fingStatus.Load() == fingUninitialized && fingStatus.CompareAndSwap(fingUninitialized, fingCreated) {
- go runfinq()
+ go runFinalizersAndCleanups()
}
}
@@ -177,7 +177,7 @@ func finalizercommit(gp *g, lock unsafe.Pointer) bool {
}
// This is the goroutine that runs all of the finalizers and cleanups.
-func runfinq() {
+func runFinalizersAndCleanups() {
var (
frame unsafe.Pointer
framecap uintptr
@@ -243,7 +243,7 @@ func runfinq() {
// cleanups also have a nil fint. Cleanups should have been processed before
// reaching this point.
if f.fint == nil {
- throw("missing type in runfinq")
+ throw("missing type in finalizer")
}
r := frame
if argRegs > 0 {
@@ -270,7 +270,7 @@ func runfinq() {
(*iface)(r).tab = assertE2I(ityp, (*eface)(r)._type)
}
default:
- throw("bad kind in runfinq")
+ throw("bad type kind in finalizer")
}
fingStatus.Or(fingRunningFinalizer)
reflectcall(nil, unsafe.Pointer(f.fn), frame, uint32(framesz), uint32(framesz), uint32(framesz), &regs)
diff --git a/src/runtime/pprof/pprof_test.go b/src/runtime/pprof/pprof_test.go
index 8a1d8e2d1f..4b8f29c918 100644
--- a/src/runtime/pprof/pprof_test.go
+++ b/src/runtime/pprof/pprof_test.go
@@ -1578,7 +1578,7 @@ func TestGoroutineProfileConcurrency(t *testing.T) {
}
includesFinalizer := func(s string) bool {
- return strings.Contains(s, "runtime.runfinq")
+ return strings.Contains(s, "runtime.runFinalizersAndCleanups")
}
// Concurrent calls to the goroutine profiler should not trigger data races
@@ -2065,7 +2065,7 @@ func TestLabelSystemstack(t *testing.T) {
// which part of the function they are
// at.
mayBeLabeled = true
- case "runtime.bgsweep", "runtime.bgscavenge", "runtime.forcegchelper", "runtime.gcBgMarkWorker", "runtime.runfinq", "runtime.sysmon":
+ case "runtime.bgsweep", "runtime.bgscavenge", "runtime.forcegchelper", "runtime.gcBgMarkWorker", "runtime.runFinalizersAndCleanups", "runtime.sysmon":
// Runtime system goroutines or threads
// (such as those identified by
// runtime.isSystemGoroutine). These
diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go
index d71c1d5d0b..2ba05395d2 100644
--- a/src/runtime/traceback.go
+++ b/src/runtime/traceback.go
@@ -1131,8 +1131,9 @@ func showfuncinfo(sf srcFunc, firstFrame bool, calleeID abi.FuncID) bool {
return false
}
- // Always show runtime.runfinq as context that this goroutine is
- // running finalizers, otherwise there is no obvious indicator.
+ // Always show runtime.runFinalizersAndCleanups as context that this
+ // goroutine is running finalizers, otherwise there is no obvious
+ // indicator.
//
// TODO(prattmic): A more general approach would be to always show the
// outermost frame (besides runtime.goexit), even if it is a runtime.
@@ -1142,7 +1143,7 @@ func showfuncinfo(sf srcFunc, firstFrame bool, calleeID abi.FuncID) bool {
// Unfortunately, implementing this requires looking ahead at the next
// frame, which goes against traceback's incremental approach (see big
// coment in traceback1).
- if sf.funcID == abi.FuncID_runfinq {
+ if sf.funcID == abi.FuncID_runFinalizersAndCleanups {
return true
}
@@ -1346,7 +1347,8 @@ func tracebackHexdump(stk stack, frame *stkframe, bad uintptr) {
// isSystemGoroutine reports whether the goroutine g must be omitted
// in stack dumps and deadlock detector. This is any goroutine that
// starts at a runtime.* entry point, except for runtime.main,
-// runtime.handleAsyncEvent (wasm only) and sometimes runtime.runfinq.
+// runtime.handleAsyncEvent (wasm only) and sometimes
+// runtime.runFinalizersAndCleanups.
//
// If fixed is true, any goroutine that can vary between user and
// system (that is, the finalizer goroutine) is considered a user
@@ -1360,7 +1362,7 @@ func isSystemGoroutine(gp *g, fixed bool) bool {
if f.funcID == abi.FuncID_runtime_main || f.funcID == abi.FuncID_corostart || f.funcID == abi.FuncID_handleAsyncEvent {
return false
}
- if f.funcID == abi.FuncID_runfinq {
+ if f.funcID == abi.FuncID_runFinalizersAndCleanups {
// We include the finalizer goroutine if it's calling
// back into user code.
if fixed {