runtime: add "success" field to sudog
authorIan Lance Taylor <iant@golang.org>
Tue, 22 Dec 2020 05:20:59 +0000 (21:20 -0800)
committerIan Lance Taylor <iant@golang.org>
Tue, 22 Dec 2020 20:13:13 +0000 (12:13 -0800)
commit3b2d8145a4c349058d76ce299ea7eea605572004
tree004c66f4f6990bed01d4afe6ecac2727f38a5aaa
parent48357ce4f22c8298ea5fb01d6873bc7bf56180e5
runtime: add "success" field to sudog

This is the gofrontend version of https://golang.org/cl/245019.
Original CL description:

    The current wakeup protocol for channel communications is that the
    second goroutine sets gp.param to the sudog when a value is
    successfully communicated over the channel, and to nil when the wakeup
    is due to closing the channel.

    Setting nil to indicate channel closure works okay for chansend and
    chanrecv, because they're only communicating with one channel, so they
    know it must be the channel that was closed. However, it means
    selectgo has to re-poll all of the channels to figure out which one
    was closed.

    This commit adds a "success" field to sudog, and changes the wakeup
    protocol to always set gp.param to sg, and to use sg.success to
    indicate successful communication vs channel closure.

    While here, this also reorganizes the chansend code slightly so that
    the sudog is still released to the pool if the send blocks and then is
    awoken because the channel closed.

    For golang/go#40410

This is being brought over to gofrontend as a step toward upgrading to
Go1.16beta1, setting up for more compiler changes related to select handling.

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/279734
gcc/go/gofrontend/MERGE
libgo/go/runtime/chan.go
libgo/go/runtime/runtime2.go
libgo/go/runtime/select.go