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  }