# HG changeset patch # User Sascha L. Teichmann # Date 1557407229 -7200 # Node ID 899914a18d7e8838c02e892d069784294f675965 # Parent 56b297592c0a178037be784690c036b422950b74 Import queue: Implemented multiple reader / one writer strategy when locking ressources. diff -r 56b297592c0a -r 899914a18d7e pkg/imports/queue.go --- 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()