forked from yuxh/gearman-go
		
	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