From 1db847fd6c24754ab2b216150c48274d6e62f481 Mon Sep 17 00:00:00 2001 From: andig Date: Sun, 16 Apr 2023 13:12:00 +0200 Subject: [PATCH] Keba: fix race in listener (#7495) --- charger/keba.go | 11 ++++------- charger/keba/listener.go | 19 +++++++++++++++++-- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/charger/keba.go b/charger/keba.go index 0554b357e..b14a1ed47 100644 --- a/charger/keba.go +++ b/charger/keba.go @@ -75,12 +75,9 @@ func NewKebaFromConfig(other map[string]interface{}) (api.Charger, error) { func NewKeba(uri, serial string, rfid RFID, timeout time.Duration) (*Keba, error) { log := util.NewLogger("keba") - if keba.Instance == nil { - var err error - keba.Instance, err = keba.New(log) - if err != nil { - return nil, err - } + instance, err := keba.Instance(log) + if err != nil { + return nil, err } // add default port @@ -101,7 +98,7 @@ func NewKeba(uri, serial string, rfid RFID, timeout time.Duration) (*Keba, error serial = conn } - keba.Instance.Subscribe(serial, c.recv) + instance.Subscribe(serial, c.recv) return c, err } diff --git a/charger/keba/listener.go b/charger/keba/listener.go index 8a6b52f9c..5dfe82a3a 100644 --- a/charger/keba/listener.go +++ b/charger/keba/listener.go @@ -23,9 +23,12 @@ const ( Any = "" ) -// Instance is the KEBA listener instance +// instance is the KEBA listener instance // This is needed since KEBAs ignore the sender port and always UDP back to port 7090 -var Instance *Listener +var ( + mu sync.Mutex + instance *Listener +) // UDPMsg transports the KEBA response. Report is any of Report1,2,3 type UDPMsg struct { @@ -43,6 +46,18 @@ type Listener struct { cache map[string]string } +func Instance(log *util.Logger) (*Listener, error) { + mu.Lock() + defer mu.Unlock() + + var err error + if instance == nil { + instance, err = New(log) + } + + return instance, err +} + // New creates a UDP listener that clients can subscribe to func New(log *util.Logger) (*Listener, error) { laddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf(":%d", Port))