From 0bc0ef868def1e5e893efb296b2e8a93ce6064cb Mon Sep 17 00:00:00 2001 From: Ron Evans Date: Sun, 25 Oct 2020 17:58:27 +0100 Subject: [PATCH] adaptor/macos: handle case when adapter enable sends notification before event delegate is set Signed-off-by: Ron Evans --- adapter_darwin.go | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/adapter_darwin.go b/adapter_darwin.go index 06bd3f0..d721fe2 100644 --- a/adapter_darwin.go +++ b/adapter_darwin.go @@ -43,16 +43,23 @@ func (a *Adapter) Enable() error { } // wait until powered - a.poweredChan = make(chan error) + a.poweredChan = make(chan error, 1) a.cmd = ¢ralManagerDelegate{a: a} a.cm.SetDelegate(a.cmd) - select { - case <-a.poweredChan: - case <-time.NewTimer(10 * time.Second).C: - return errors.New("timeout enabling CentralManager") + + if a.cm.State() != cbgo.ManagerStatePoweredOn { + select { + case <-a.poweredChan: + case <-time.NewTimer(10 * time.Second).C: + return errors.New("timeout enabling CentralManager") + } + } + + // drain any extra powered-on events from channel + for len(a.poweredChan) > 0 { + <-a.poweredChan } - a.poweredChan = nil // wait until powered? a.pmd = &peripheralManagerDelegate{a: a} @@ -73,7 +80,7 @@ type centralManagerDelegate struct { func (cmd *centralManagerDelegate) CentralManagerDidUpdateState(cmgr cbgo.CentralManager) { // powered on? if cmgr.State() == cbgo.ManagerStatePoweredOn { - close(cmd.a.poweredChan) + cmd.a.poweredChan <- nil } // TODO: handle other state changes.