mirror of
https://github.com/golang/go
synced 2024-11-21 20:14:52 -07:00
netchan: fix locking bug.
There's no need to hold the client mutex when calling encode, since encode itself uses a mutex to make the writes atomic. However, we need to keep the messages ordered, so add a mutex for that purpose alone. Fixes #1244. R=rsc CC=golang-dev https://golang.org/cl/2833041
This commit is contained in:
parent
396228a652
commit
59315fbfb5
@ -52,6 +52,7 @@ type expClient struct {
|
||||
errored bool // client has been sent an error
|
||||
seqNum int64 // sequences messages sent to client; has value of highest sent
|
||||
ackNum int64 // highest sequence number acknowledged
|
||||
seqLock sync.Mutex // guarantees messages are in sequence, only locked under mu
|
||||
}
|
||||
|
||||
func newClient(exp *Exporter, conn net.Conn) *expClient {
|
||||
@ -171,8 +172,10 @@ func (client *expClient) serveRecv(hdr header, count int64) {
|
||||
client.mu.Lock()
|
||||
client.seqNum++
|
||||
hdr.seqNum = client.seqNum
|
||||
err := client.encode(&hdr, payData, val.Interface())
|
||||
client.seqLock.Lock() // guarantee ordering of messages
|
||||
client.mu.Unlock()
|
||||
err := client.encode(&hdr, payData, val.Interface())
|
||||
client.seqLock.Unlock()
|
||||
if err != nil {
|
||||
expLog("error encoding client response:", err)
|
||||
client.sendError(&hdr, err.String())
|
||||
|
Loading…
Reference in New Issue
Block a user