]> Cypherpunks repositories - gostls13.git/commitdiff
netchan: fix locking bug.
authorRob Pike <r@golang.org>
Tue, 2 Nov 2010 17:58:27 +0000 (10:58 -0700)
committerRob Pike <r@golang.org>
Tue, 2 Nov 2010 17:58:27 +0000 (10:58 -0700)
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

src/pkg/netchan/export.go

index 318b865b0b9eb982747dc48e1796ec027ecd25f2..8c87ee8ce4cf3ae2931c78c67f4cbe4d1061bc91 100644 (file)
@@ -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())