mirror of
https://github.com/golang/go
synced 2024-11-22 08:04:39 -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
|
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())
|
||||||
|
Loading…
Reference in New Issue
Block a user