in nmxact/nmble/sync.go [100:155]
func (s *Syncer) listen() error {
errChan := make(chan error)
s.wg.Add(1)
go func() {
defer s.wg.Done()
// Initial actions can cause an error to be returned.
syncl, err := s.addSyncListener()
if err != nil {
errChan <- err
close(errChan)
return
}
defer s.x.RemoveListener(syncl)
resetl, err := s.addResetListener()
if err != nil {
errChan <- err
close(errChan)
return
}
defer s.x.RemoveListener(resetl)
// Initial actions complete.
close(errChan)
for {
select {
case <-syncl.ErrChan:
// XXX
case bm := <-syncl.MsgChan:
switch msg := bm.(type) {
case *BleSyncEvt:
s.setSynced(msg.Synced)
}
case <-resetl.ErrChan:
// XXX
case bm := <-resetl.MsgChan:
switch msg := bm.(type) {
case *BleResetEvt:
s.setSynced(false)
s.resetCh <- msg.Reason
}
case <-s.stopCh:
// It is OK to strand the two listeners. Their deferred
// removal will drain them.
return
}
}
}()
return <-errChan
}