1
0
mirror of https://github.com/golang/go synced 2024-11-25 05:57:57 -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:
Rob Pike 2010-11-02 10:58:27 -07:00
parent 396228a652
commit 59315fbfb5

View File

@ -52,6 +52,7 @@ type expClient struct {
errored bool // client has been sent an error errored bool // client has been sent an error
seqNum int64 // sequences messages sent to client; has value of highest sent seqNum int64 // sequences messages sent to client; has value of highest sent
ackNum int64 // highest sequence number acknowledged 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 { func newClient(exp *Exporter, conn net.Conn) *expClient {
@ -171,8 +172,10 @@ func (client *expClient) serveRecv(hdr header, count int64) {
client.mu.Lock() client.mu.Lock()
client.seqNum++ client.seqNum++
hdr.seqNum = client.seqNum hdr.seqNum = client.seqNum
err := client.encode(&hdr, payData, val.Interface()) client.seqLock.Lock() // guarantee ordering of messages
client.mu.Unlock() client.mu.Unlock()
err := client.encode(&hdr, payData, val.Interface())
client.seqLock.Unlock()
if err != nil { if err != nil {
expLog("error encoding client response:", err) expLog("error encoding client response:", err)
client.sendError(&hdr, err.String()) client.sendError(&hdr, err.String())