• Austin Clements's avatar
    runtime: add general suspendG/resumeG · 3f834114
    Austin Clements authored
    Currently, the process of suspending a goroutine is tied to stack
    scanning. In preparation for non-cooperative preemption, this CL
    abstracts this into general purpose suspendG/resumeG functions.
    
    suspendG and resumeG closely follow the existing scang and restartg
    functions with one exception: the addition of a _Gpreempted status.
    Currently, preemption tasks (stack scanning) are carried out by the
    target goroutine if it's in _Grunning. In this new approach, the task
    is always carried out by the goroutine that called suspendG. Thus, we
    need a reliable way to drive the target goroutine out of _Grunning
    until the requesting goroutine is ready to resume it. The new
    _Gpreempted state provides the handshake: when a runnable goroutine
    responds to a preemption request, it now parks itself and enters
    _Gpreempted. The requesting goroutine races to put it in _Gwaiting,
    which gives it ownership, but also the responsibility to start it
    again.
    
    This CL adds several TODOs about improving the synchronization on the
    G status. The existing code already has these problems; we're just
    taking note of them.
    
    The next CL will remove the now-dead scang and preemptscan.
    
    For #10958, #24543.
    
    Change-Id: I16dbf87bea9d50399cc86719c156f48e67198f16
    Reviewed-on: https://go-review.googlesource.com/c/go/+/201137
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
    3f834114
proc.go 153 KB