aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/proc.go
diff options
context:
space:
mode:
authorLucien Coffe <lucien.coffe@botify.com>2023-04-21 17:20:19 +0200
committerGopher Robot <gobot@golang.org>2023-04-21 20:14:08 +0000
commitf229787affbcaafb55dac2ceae65282b172e253a (patch)
treeca6a823087ca9d55bf1226e138129c0f2638fd0e /src/runtime/proc.go
parent6328e445c3a87d64a32b6203af3f39d43d874f9f (diff)
downloadgo-f229787affbcaafb55dac2ceae65282b172e253a.tar.xz
runtime: prevent double lock in checkdead by unlocking before throws
This change resolves an issue where checkdead could result in a double lock when shedtrace is enabled. This fix involves adding unlocks before all throws in the checkdead function to ensure the scheduler lock is properly released. Fixes #59758 Change-Id: If3ddf9969f4582c3c88dee9b9ecc355a63958103 Reviewed-on: https://go-review.googlesource.com/c/go/+/487375 Run-TryBot: Michael Pratt <mpratt@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com> Auto-Submit: Michael Pratt <mpratt@google.com> Reviewed-by: Michael Pratt <mpratt@google.com>
Diffstat (limited to 'src/runtime/proc.go')
-rw-r--r--src/runtime/proc.go4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/runtime/proc.go b/src/runtime/proc.go
index 23d760bf84..fdbf888c4f 100644
--- a/src/runtime/proc.go
+++ b/src/runtime/proc.go
@@ -5194,6 +5194,7 @@ func checkdead() {
}
if run < 0 {
print("runtime: checkdead: nmidle=", sched.nmidle, " nmidlelocked=", sched.nmidlelocked, " mcount=", mcount(), " nmsys=", sched.nmsys, "\n")
+ unlock(&sched.lock)
throw("checkdead: inconsistent counts")
}
@@ -5211,6 +5212,7 @@ func checkdead() {
_Grunning,
_Gsyscall:
print("runtime: checkdead: find g ", gp.goid, " in status ", s, "\n")
+ unlock(&sched.lock)
throw("checkdead: runnable g")
}
})
@@ -5229,12 +5231,14 @@ func checkdead() {
if pp == nil {
// There should always be a free P since
// nothing is running.
+ unlock(&sched.lock)
throw("checkdead: no p for timer")
}
mp := mget()
if mp == nil {
// There should always be a free M since
// nothing is running.
+ unlock(&sched.lock)
throw("checkdead: no m for timer")
}
// M must be spinning to steal. We set this to be