Skip to content

Commit 3640c57

Browse files
maxatomegopherbot
authored andcommitted
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: a7fce45 GitHub-Pull-Request: #45 Reviewed-on: https://go-review.googlesource.com/c/exp/+/436888 Run-TryBot: Bryan Mills <[email protected]> Reviewed-by: Bryan Mills <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Auto-Submit: Bryan Mills <[email protected]> Reviewed-by: Joedian Reid <[email protected]>
1 parent 59b0eab commit 3640c57

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

jsonrpc2/conn.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ func newConnection(ctx context.Context, rwc io.ReadWriteCloser, binder Binder) (
8585
outgoingBox: make(chan map[ID]chan<- *Response, 1),
8686
incomingBox: make(chan map[ID]*incoming, 1),
8787
}
88+
c.async.init()
8889

8990
options, err := binder.Bind(ctx, c)
9091
if err != nil {
@@ -101,7 +102,6 @@ func newConnection(ctx context.Context, rwc io.ReadWriteCloser, binder Binder) (
101102
}
102103
c.outgoingBox <- make(map[ID]chan<- *Response)
103104
c.incomingBox <- make(map[ID]*incoming)
104-
c.async.init()
105105
// the goroutines started here will continue until the underlying stream is closed
106106
reader := options.Framer.Reader(rwc)
107107
readToQueue := make(chan *incoming)

0 commit comments

Comments
 (0)