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>
1 file changed
tree: 3601cbab0be9cbc37f7fce4e6ab155346a67b413
  1. apidiff/
  2. cmd/
  3. constraints/
  4. devtools/
  5. ebnf/
  6. ebnflint/
  7. errors/
  8. event/
  9. inotify/
  10. io/
  11. jsonrpc2/
  12. maps/
  13. mmap/
  14. rand/
  15. shiny/
  16. shootout/
  17. slices/
  18. slog/
  19. sumdb/
  20. typeparams/
  21. utf8string/
  22. .gitattributes
  23. .gitignore
  24. codereview.cfg
  25. CONTRIBUTING.md
  26. go.mod
  27. go.sum
  28. LICENSE
  29. PATENTS
  30. README.md
README.md

exp

PkgGoDev

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.