plugin: allow querying plugin graph to be re-entrant
Signed-off-by: Stephen J Day <stephen.day@docker.com>
This commit is contained in:
parent
363d692f35
commit
d8bd6b70ce
@ -70,7 +70,7 @@ type Service interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var register = struct {
|
var register = struct {
|
||||||
sync.Mutex
|
sync.RWMutex
|
||||||
r []*Registration
|
r []*Registration
|
||||||
}{}
|
}{}
|
||||||
|
|
||||||
@ -103,24 +103,28 @@ func Register(r *Registration) {
|
|||||||
|
|
||||||
// Graph returns an ordered list of registered plugins for initialization
|
// Graph returns an ordered list of registered plugins for initialization
|
||||||
func Graph() (ordered []*Registration) {
|
func Graph() (ordered []*Registration) {
|
||||||
|
register.RLock()
|
||||||
|
defer register.RUnlock()
|
||||||
|
|
||||||
|
added := map[*Registration]bool{}
|
||||||
for _, r := range register.r {
|
for _, r := range register.r {
|
||||||
children(r.Requires, &ordered)
|
children(r.Requires, added, &ordered)
|
||||||
if !r.added {
|
if !added[r] {
|
||||||
ordered = append(ordered, r)
|
ordered = append(ordered, r)
|
||||||
r.added = true
|
added[r] = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ordered
|
return ordered
|
||||||
}
|
}
|
||||||
|
|
||||||
func children(types []Type, ordered *[]*Registration) {
|
func children(types []Type, added map[*Registration]bool, ordered *[]*Registration) {
|
||||||
for _, t := range types {
|
for _, t := range types {
|
||||||
for _, r := range register.r {
|
for _, r := range register.r {
|
||||||
if r.Type == t {
|
if r.Type == t {
|
||||||
children(r.Requires, ordered)
|
children(r.Requires, added, ordered)
|
||||||
if !r.added {
|
if !added[r] {
|
||||||
*ordered = append(*ordered, r)
|
*ordered = append(*ordered, r)
|
||||||
r.added = true
|
added[r] = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user