]> git.basschouten.com Git - openhab-addons.git/commitdiff
[enocean] Fix concurrency exception on startup (#11408)
authorThomas Lauterbach <2452988+DrRSatzteil@users.noreply.github.com>
Wed, 20 Oct 2021 22:08:18 +0000 (00:08 +0200)
committerGitHub <noreply@github.com>
Wed, 20 Oct 2021 22:08:18 +0000 (00:08 +0200)
* made listeners a ConcurrentHashMap
* synchronized access to listeners and eventListeners collections of EnOceanTransceiver
* reverted ConcurrentHashMap change as NULL-Key is required

Fixes #11393

Also-by: Daniel Weber <uni@fruggy.de>
Signed-off-by: Thomas Lauterbach <lauterbachthomas@gmail.com>
bundles/org.openhab.binding.enocean/src/main/java/org/openhab/binding/enocean/internal/transceiver/EnOceanTransceiver.java

index 55be4988b02598bd094cae4e0fe60e2493cae465..625798e9703d41ef0d245ad3afcbd1536e730d84 100644 (file)
@@ -220,6 +220,7 @@ public abstract class EnOceanTransceiver implements SerialPortEventListener {
         readingTask = null;
         timeOut = null;
         listeners.clear();
+        eventListeners.clear();
         teachInListener = null;
         errorListener = null;
 
@@ -302,9 +303,11 @@ public abstract class EnOceanTransceiver implements SerialPortEventListener {
                         }
 
                         long s = Long.parseLong(HexUtils.bytesToHex(senderId), 16);
-                        HashSet<PacketListener> pl = listeners.get(s);
-                        if (pl != null) {
-                            pl.forEach(l -> l.packetReceived(msg));
+                        synchronized (this) {
+                            HashSet<PacketListener> pl = listeners.get(s);
+                            if (pl != null) {
+                                pl.forEach(l -> l.packetReceived(msg));
+                            }
                         }
                     }
                 } else {
@@ -331,7 +334,9 @@ public abstract class EnOceanTransceiver implements SerialPortEventListener {
                     }
                 }
 
-                eventListeners.forEach(l -> l.eventReceived(event));
+                synchronized (this) {
+                    eventListeners.forEach(l -> l.eventReceived(event));
+                }
             }
         } catch (Exception e) {
             logger.error("Exception in informListeners", e);
@@ -374,13 +379,13 @@ public abstract class EnOceanTransceiver implements SerialPortEventListener {
 
     protected abstract byte[] serializePacket(BasePacket packet) throws EnOceanException;
 
-    public void addPacketListener(PacketListener listener, long senderIdToListenTo) {
+    public synchronized void addPacketListener(PacketListener listener, long senderIdToListenTo) {
         if (listeners.computeIfAbsent(senderIdToListenTo, k -> new HashSet<>()).add(listener)) {
             logger.debug("Listener added: {}", senderIdToListenTo);
         }
     }
 
-    public void removePacketListener(PacketListener listener, long senderIdToListenTo) {
+    public synchronized void removePacketListener(PacketListener listener, long senderIdToListenTo) {
         HashSet<PacketListener> pl = listeners.get(senderIdToListenTo);
         if (pl != null) {
             pl.remove(listener);
@@ -390,11 +395,11 @@ public abstract class EnOceanTransceiver implements SerialPortEventListener {
         }
     }
 
-    public void addEventMessageListener(EventListener listener) {
+    public synchronized void addEventMessageListener(EventListener listener) {
         eventListeners.add(listener);
     }
 
-    public void removeEventMessageListener(EventListener listener) {
+    public synchronized void removeEventMessageListener(EventListener listener) {
         eventListeners.remove(listener);
     }