Mercurial > gemma
diff pkg/imports/queue.go @ 3221:899914a18d7e
Import queue: Implemented multiple reader / one writer strategy when locking ressources.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Thu, 09 May 2019 15:07:09 +0200 |
parents | 4acbee65275d |
children | 1a0985083c06 |
line wrap: on
line diff
--- a/pkg/imports/queue.go Thu May 09 14:21:50 2019 +0200 +++ b/pkg/imports/queue.go Thu May 09 15:07:09 2019 +0200 @@ -107,13 +107,13 @@ signalChan chan struct{} creatorsMu sync.Mutex creators map[JobKind]JobCreator - usedDeps map[string]struct{} + usedDeps map[string]int } var iqueue = importQueue{ signalChan: make(chan struct{}), creators: map[JobKind]JobCreator{}, - usedDeps: map[string]struct{}{}, + usedDeps: map[string]int{}, } var ( @@ -438,12 +438,10 @@ q.creatorsMu.Lock() nextCreator: for kind, jc := range q.creators { - deps := jc.Depends() - for l := range deps { - for _, d := range deps[l] { - if _, found := q.usedDeps[d]; found { - continue nextCreator - } + // only test exclusive locks + for _, d := range jc.Depends()[0] { + if q.usedDeps[d] > 0 { + continue nextCreator } } which = append(which, string(kind)) @@ -595,10 +593,9 @@ // Lock dependencies. q.creatorsMu.Lock() - deps := jc.Depends() - for l := range deps { - for _, d := range deps[l] { - q.usedDeps[d] = struct{}{} + for _, deps := range jc.Depends() { + for _, d := range deps { + q.usedDeps[d]++ } } q.creatorsMu.Unlock() @@ -608,10 +605,9 @@ // Unlock the dependencies. defer func() { q.creatorsMu.Lock() - deps := jc.Depends() - for l := range deps { - for _, d := range deps[l] { - delete(q.usedDeps, d) + for _, deps := range jc.Depends() { + for _, d := range deps { + q.usedDeps[d]-- } } q.creatorsMu.Unlock()