I tried to read code of mgo, and the function SimpleQuery in socket.go confused me. In this function, there are two local mutex: https://github.com/go-mgo/mgo/blob/v2-unstable/socket.go
func (socket *mongoSocket) SimpleQuery(op *queryOp) (data []byte, err error) {
var wait, change sync.Mutex
var replyDone bool
var replyData []byte
var replyErr error
wait.Lock()
op.replyFunc = func(err error, reply *replyOp, docNum int, docData []byte) {
change.Lock()
if !replyDone {
replyDone = true
replyErr = err
if err == nil {
replyData = docData
}
}
change.Unlock()
wait.Unlock()
}
err = socket.Query(op)
if err != nil {
return nil, err
}
wait.Lock()
change.Lock()
data = replyData
err = replyErr
change.Unlock()
return data, err
}
As my understanding, for each call, there will be a new local mutex, so, it's actually protecting anything, why they put the mutex here?