mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: perform debug call injection on a new goroutine
Currently, when a debugger injects a call, that call happens on the goroutine where the debugger injected it. However, this requires significant runtime complexity that we're about to remove. To prepare for this, this CL switches to a different approach that leaves the interrupted goroutine parked and runs the debug call on a new goroutine. When the debug call returns, it resumes the original goroutine. This should be essentially transparent to debuggers. It follows the exact same call injection protocol and ensures the whole protocol executes indivisibly on a single OS thread. The only difference is that the current G and stack now change part way through the protocol. For #36365. Change-Id: I68463bfd73cbee06cfc49999606410a59dd8f653 Reviewed-on: https://go-review.googlesource.com/c/go/+/229299 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
b3863fbbc2
commit
3633d2c545
3 changed files with 132 additions and 6 deletions
|
|
@ -980,6 +980,7 @@ const (
|
|||
waitReasonWaitForGCCycle // "wait for GC cycle"
|
||||
waitReasonGCWorkerIdle // "GC worker (idle)"
|
||||
waitReasonPreempted // "preempted"
|
||||
waitReasonDebugCall // "debug call"
|
||||
)
|
||||
|
||||
var waitReasonStrings = [...]string{
|
||||
|
|
@ -1009,6 +1010,7 @@ var waitReasonStrings = [...]string{
|
|||
waitReasonWaitForGCCycle: "wait for GC cycle",
|
||||
waitReasonGCWorkerIdle: "GC worker (idle)",
|
||||
waitReasonPreempted: "preempted",
|
||||
waitReasonDebugCall: "debug call",
|
||||
}
|
||||
|
||||
func (w waitReason) String() string {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue