github.com/simpleiot/simpleiot@v0.18.3/client/run_group.go (about) 1 package client 2 3 import ( 4 "sync" 5 6 "github.com/oklog/run" 7 ) 8 9 // RunGroup is used to group a list of clients and start/stop them 10 // currently a thin wrapper around run.Group that adds a Stop() function 11 type RunGroup struct { 12 name string 13 stop chan struct{} 14 stopOnce sync.Once 15 group run.Group 16 } 17 18 // NewRunGroup creates a new client group 19 func NewRunGroup(name string) *RunGroup { 20 return &RunGroup{name: name, stop: make(chan struct{})} 21 } 22 23 // Add client to group 24 func (g *RunGroup) Add(client RunStop) { 25 g.group.Add(client.Run, client.Stop) 26 } 27 28 // Run clients. This function blocks until error or stopped. 29 // all clients must be added before runner is started 30 func (g *RunGroup) Run() error { 31 g.group.Add(func() error { 32 <-g.stop 33 return nil 34 }, func(_ error) { 35 g.Stop(nil) 36 }) 37 38 err := g.group.Run() 39 40 return err 41 } 42 43 // Stop clients 44 func (g *RunGroup) Stop(_ error) { 45 g.stopOnce.Do(func() { close(g.stop) }) 46 }