• Austin Clements's avatar
    runtime: use signals to preempt Gs for suspendG · 62e53b79
    Austin Clements authored
    This adds support for pausing a running G by sending a signal to its
    M.
    
    The main complication is that we want to target a G, but can only send
    a signal to an M. Hence, the protocol we use is to simply mark the G
    for preemption (which we already do) and send the M a "wake up and
    look around" signal. The signal checks if it's running a G with a
    preemption request and stops it if so in the same way that stack check
    preemptions stop Gs. Since the preemption may fail (the G could be
    moved or the signal could arrive at an unsafe point), we keep a count
    of the number of received preemption signals. This lets stopG detect
    if its request failed and should be retried without an explicit
    channel back to suspendG.
    
    For #10958, #24543.
    
    Change-Id: I3e1538d5ea5200aeb434374abb5d5fdc56107e53
    Reviewed-on: https://go-review.googlesource.com/c/go/+/201760
    Run-TryBot: Austin Clements <austin@google.com>
    Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
    62e53b79
runtime2.go 36.7 KB