func()

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
}