in nmxact/nmble/ble_xport.go [408:465]
func (bx *BleXport) Start() error {
initialize := func() error {
bx.mtx.Lock()
defer bx.mtx.Unlock()
if bx.enabled {
return nmxutil.NewXportError("BLE xport double start")
}
bx.enabled = true
return nil
}
if err := initialize(); err != nil {
return err
}
startTask := func() chan error {
if err := bx.tq.Start(10); err != nil {
nmxutil.Assert(false)
}
bx.stopChan = make(chan struct{})
return bx.tq.Enqueue(bx.startEvent)
}
// Enqueue start event and block until it completes. If this first attempt
// fails, abort the start procedure completely (don't enter the retry
// loop).
if err := <-startTask(); err != nil {
bx.mtx.Lock()
bx.enabled = false
bx.mtx.Unlock()
return err
}
// Run and restart task queue in the background.
go func() {
isEnabled := func() bool {
bx.mtx.Lock()
defer bx.mtx.Unlock()
return bx.enabled
}
for {
<-bx.stopChan
bx.wg.Wait()
if !bx.cfg.Restart || !isEnabled() {
break
}
startTask()
}
}()
return nil
}