enc *gob.Encoder
dec *gob.Decoder
pending map[uint64]*Call
+ closing bool
}
func (client *Client) send(c *Call) {
response := new(Response)
err = client.dec.Decode(response)
if err != nil {
- if err == os.EOF {
+ if err == os.EOF && !client.closing {
err = io.ErrUnexpectedEOF
}
break
_ = call.Done <- call // do not block
}
client.mutex.Unlock()
- log.Stderr("rpc: client protocol error:", err)
+ if err != os.EOF || !client.closing {
+ log.Stderr("rpc: client protocol error:", err)
+ }
}
// NewClient returns a new Client to handle requests to the
return NewClient(conn), nil
}
+func (client *Client) Close() os.Error {
+ if client.shutdown != nil || client.closing {
+ return os.ErrorString("rpc: already closed")
+ }
+ client.mutex.Lock()
+ client.closing = true
+ client.mutex.Unlock()
+ return client.conn.Close()
+}
+
// Go invokes the function asynchronously. It returns the Call structure representing
// the invocation. The done channel will signal when the call is complete by returning
// the same Call object. If done is nil, Go will allocate a new channel.