Browse Source

Merge pull request #1 from Detectify/develop

Add lock on job handler assignment
tags/0.2
Christoffer Fjellström GitHub 6 years ago
parent
commit
d9ad23413d
1 changed files with 12 additions and 4 deletions
  1. +12
    -4
      client/client.go

+ 12
- 4
client/client.go View File

@@ -31,7 +31,7 @@ type Client struct {
} }


type responseHandlerMap struct { type responseHandlerMap struct {
sync.RWMutex
sync.Mutex
holder map[string]ResponseHandler holder map[string]ResponseHandler
} }


@@ -46,17 +46,22 @@ func (r *responseHandlerMap) remove(key string) {
} }


func (r *responseHandlerMap) get(key string) (ResponseHandler, bool) { func (r *responseHandlerMap) get(key string) (ResponseHandler, bool) {
r.RLock()
r.Lock()
rh, b := r.holder[key] rh, b := r.holder[key]
r.RUnlock()
r.Unlock()
return rh, b return rh, b
} }

func (r *responseHandlerMap) put(key string, rh ResponseHandler) { func (r *responseHandlerMap) put(key string, rh ResponseHandler) {
r.Lock() r.Lock()
r.holder[key] = rh r.holder[key] = rh
r.Unlock() r.Unlock()
} }


func (r *responseHandlerMap) putNoLock(key string, rh ResponseHandler) {
r.holder[key] = rh
}

// Return a client. // Return a client.
func New(network, addr string) (client *Client, err error) { func New(network, addr string) (client *Client, err error) {
client = &Client{ client = &Client{
@@ -266,9 +271,12 @@ func (client *Client) Do(funcname string, data []byte,
default: default:
datatype = dtSubmitJob datatype = dtSubmitJob
} }

client.respHandler.Lock()
defer client.respHandler.Unlock()
handle, err = client.do(funcname, data, datatype) handle, err = client.do(funcname, data, datatype)
if err == nil && h != nil { if err == nil && h != nil {
client.respHandler.put(handle, h)
client.respHandler.putNoLock(handle, h)
} }
return return
} }


Loading…
Cancel
Save