Commit 3640c57
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
1 file changed
+1
-1
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
85 | 85 | | |
86 | 86 | | |
87 | 87 | | |
| 88 | + | |
88 | 89 | | |
89 | 90 | | |
90 | 91 | | |
| |||
101 | 102 | | |
102 | 103 | | |
103 | 104 | | |
104 | | - | |
105 | 105 | | |
106 | 106 | | |
107 | 107 | | |
| |||
0 commit comments