split output init

This commit is contained in:
davidnewhall2 2020-06-30 04:30:56 -07:00
parent f1738c2aa6
commit e733ba2a1d
1 changed files with 20 additions and 19 deletions

View File

@ -52,30 +52,15 @@ func (u *UnifiPoller) Poller() Poller {
// InitializeOutputs runs all the configured output plugins.
// If none exist, or they all exit an error is returned.
func (u *UnifiPoller) InitializeOutputs() error {
// Output plugin errors go into this channel.
v := make(chan error)
defer close(v)
count, errChan := u.runOutputMethods()
defer close(errChan)
var count int // keep track of running output plugin count.
outputSync.RLock()
for _, o := range outputs {
count++
go func(o *Output) {
v <- o.Method(u)
}(o)
}
outputSync.RUnlock() // the loop below never exits, so cannot defer this.
if count < 1 {
if count == 0 {
return errNoOutputPlugins
}
// Wait for and return an error from any output plugin.
for err := range v {
for err := range errChan {
if err != nil {
return err
}
@ -88,6 +73,22 @@ func (u *UnifiPoller) InitializeOutputs() error {
return nil
}
func (u *UnifiPoller) runOutputMethods() (int, chan error) {
// Output plugin errors go into this channel.
err := make(chan error)
outputSync.RLock()
defer outputSync.RUnlock()
for _, o := range outputs {
go func(o *Output) {
err <- o.Method(u) // Run each output plugin
}(o)
}
return len(outputs), err
}
// Outputs allows other output plugins to see the list of loaded output plugins.
func (u *UnifiPoller) Outputs() (names []string) {
outputSync.RLock()