diff --git a/pgraph/pgraph.go b/pgraph/pgraph.go index 4035ed16..295c3f2a 100644 --- a/pgraph/pgraph.go +++ b/pgraph/pgraph.go @@ -61,6 +61,7 @@ type Graph struct { mutex *sync.Mutex // used when modifying graph State variable wg *sync.WaitGroup semas map[string]*semaphore.Semaphore + slock *sync.Mutex // semaphore mutex prometheus *prometheus.Prometheus // the prometheus instance } @@ -89,6 +90,7 @@ func NewGraph(name string) *Graph { mutex: &sync.Mutex{}, wg: &sync.WaitGroup{}, semas: make(map[string]*semaphore.Semaphore), + slock: &sync.Mutex{}, } } @@ -126,6 +128,7 @@ func (g *Graph) Copy() *Graph { mutex: g.mutex, wg: g.wg, semas: g.semas, + slock: g.slock, prometheus: g.prometheus, } diff --git a/pgraph/semaphore.go b/pgraph/semaphore.go index 9a32697b..08185c73 100644 --- a/pgraph/semaphore.go +++ b/pgraph/semaphore.go @@ -46,11 +46,13 @@ func (g *Graph) SemaLock(semas []string) error { } } + g.slock.Lock() // semaphore creation lock sema, ok := g.semas[id] // lookup if !ok { g.semas[id] = semaphore.NewSemaphore(size) sema = g.semas[id] } + g.slock.Unlock() if err := sema.P(1); err != nil { // lock! reterr = multierr.Append(reterr, err) // list of errors