Merge pull request #36 from rlmcpherson/master

Make pool clients safe for concurrent access with mutex.
This commit is contained in:
Xing 2014-05-21 10:03:32 +08:00
commit e9ce09b885

View File

@ -18,7 +18,8 @@ var (
type poolClient struct { type poolClient struct {
*Client *Client
Rate int Rate int
mutex sync.Mutex
} }
type SelectionHandler func(map[string]*poolClient, string) string type SelectionHandler func(map[string]*poolClient, string) string
@ -95,6 +96,8 @@ func (pool *Pool) Remove(addr string) {
func (pool *Pool) Do(funcname string, data []byte, func (pool *Pool) Do(funcname string, data []byte,
flag byte, h ResponseHandler) (addr, handle string, err error) { flag byte, h ResponseHandler) (addr, handle string, err error) {
client := pool.selectServer() client := pool.selectServer()
client.Lock()
defer client.Unlock()
handle, err = client.Do(funcname, data, flag, h) handle, err = client.Do(funcname, data, flag, h)
addr = client.addr addr = client.addr
return return
@ -103,6 +106,8 @@ func (pool *Pool) Do(funcname string, data []byte,
func (pool *Pool) DoBg(funcname string, data []byte, func (pool *Pool) DoBg(funcname string, data []byte,
flag byte) (addr, handle string, err error) { flag byte) (addr, handle string, err error) {
client := pool.selectServer() client := pool.selectServer()
client.Lock()
defer client.Unlock()
handle, err = client.DoBg(funcname, data, flag) handle, err = client.DoBg(funcname, data, flag)
addr = client.addr addr = client.addr
return return
@ -112,6 +117,8 @@ func (pool *Pool) DoBg(funcname string, data []byte,
// !!!Not fully tested.!!! // !!!Not fully tested.!!!
func (pool *Pool) Status(addr, handle string) (status *Status, err error) { func (pool *Pool) Status(addr, handle string) (status *Status, err error) {
if client, ok := pool.clients[addr]; ok { if client, ok := pool.clients[addr]; ok {
client.Lock()
defer client.Unlock()
status, err = client.Status(handle) status, err = client.Status(handle)
} else { } else {
err = ErrNotFound err = ErrNotFound
@ -131,6 +138,8 @@ func (pool *Pool) Echo(addr string, data []byte) (echo []byte, err error) {
return return
} }
} }
client.Lock()
defer client.Unlock()
echo, err = client.Echo(data) echo, err = client.Echo(data)
return return
} }