Merge pull request #36 from rlmcpherson/master
Make pool clients safe for concurrent access with mutex.
This commit is contained in:
		
						commit
						e9ce09b885
					
				| @ -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 | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user