commit | 3640c57a48eaf002ca5d5465ef7dac29310631a4 | [log] [tgz] |
---|---|---|
author | Maxime Soulé <zeptomax@gmail.com> | Tue Oct 11 14:25:48 2022 +0000 |
committer | Gopher Robot <gobot@golang.org> | Wed Oct 12 13:45:08 2022 +0000 |
tree | 3601cbab0be9cbc37f7fce4e6ab155346a67b413 | |
parent | 59b0eab1532e130b420c72530677481d49c34f13 [diff] |
jsonrpc2: initialize Connection.async before calling binder.Bind If Connection.async is not initialized before calling binder.Bind() and a goroutine is spawned in binder.Bind() to monitor the end of the connection using conn.Wait(), this conn.Wait() can wait forever: func (s *MyServer) Bind( ctx context.Context, conn *jsonrpc2.Connection, ) (jsonrpc2.ConnectionOptions, error) { // XXX register conn in *MyServer // monitor the end of the connection go func() { conn.Wait() conn.Close() // YYY do some cleanup in *MyServer }() return jsonrpc2.ConnectionOptions{}, nil } The "// YYY do some cleanup in *MyServer" should be reached for each end of connection. If Connection.async is initialized too late, after conn.Wait() is called in the Bind() spawned goroutine, conn.Wait() never returns as it reads on a nil conn.async.ready channel. Fixes #56131. Change-Id: I3c6e69d7dcc860479c4518ebd18e2431606322bc GitHub-Last-Rev: a7fce452df55a8dd113790d00097c37db454eb3b GitHub-Pull-Request: golang/exp#45 Reviewed-on: https://go-review.googlesource.com/c/exp/+/436888 Run-TryBot: Bryan Mills <bcmills@google.com> Reviewed-by: Bryan Mills <bcmills@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Auto-Submit: Bryan Mills <bcmills@google.com> Reviewed-by: Joedian Reid <joedian@golang.org>
This subrepository holds experimental and deprecated (in the old
directory) packages.
The idea for this subrepository originated as the pkg/exp
directory of the main repository, but its presence there made it unavailable to users of the binary downloads of the Go installation. The subrepository has therefore been created to make it possible to go get
these packages.
Warning: Packages here are experimental and unreliable. Some may one day be promoted to the main repository or other subrepository, or they may be modified arbitrarily or even disappear altogether.
In short, code in this subrepository is not subject to the Go 1 compatibility promise. (No subrepo is, but the promise is even more likely to be violated by go.exp than the others.)
Caveat emptor.