]> git.basschouten.com Git - openhab-addons.git/commitdiff
[teleinfo] Fix memory leak (#9724)
authorolivierkeke <olivierkeke@users.noreply.github.com>
Wed, 13 Jan 2021 19:40:25 +0000 (20:40 +0100)
committerGitHub <noreply@github.com>
Wed, 13 Jan 2021 19:40:25 +0000 (11:40 -0800)
* Use set instead list to avoid duplicate listeners
* Remove from listeners when bridge is not ONLINE
* Unsubscribe from bridge handler events when thing handler is disposed

Signed-off-by: Olivier Marceau <hollysaiqs@marceau.ovh>
bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/TeleinfoAbstractControllerHandler.java
bundles/org.openhab.binding.teleinfo/src/main/java/org/openhab/binding/teleinfo/internal/handler/TeleinfoAbstractElectricityMeterHandler.java

index 640baec390c216fcbccf03b8ec7f669d1c4f361c..4397f4d05a674eaa14bea72dad75e3c220227750 100644 (file)
  */
 package org.openhab.binding.teleinfo.internal.handler;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.openhab.binding.teleinfo.internal.TeleinfoDiscoveryService;
@@ -32,7 +32,7 @@ import org.openhab.core.thing.binding.ThingHandlerService;
 @NonNullByDefault
 public abstract class TeleinfoAbstractControllerHandler extends BaseBridgeHandler {
 
-    private List<TeleinfoControllerHandlerListener> listeners = Collections.synchronizedList(new ArrayList<>());
+    private Set<TeleinfoControllerHandlerListener> listeners = new CopyOnWriteArraySet<>();
 
     public TeleinfoAbstractControllerHandler(Bridge bridge) {
         super(bridge);
index 35d2cee7c4f1b98773ba8e57a5947679d47300bf..ffa711c3fc641c8da2318c4cf0a33abccdb1bb92 100644 (file)
@@ -65,22 +65,35 @@ public abstract class TeleinfoAbstractElectricityMeterHandler extends BaseThingH
 
     @Override
     public void bridgeStatusChanged(ThingStatusInfo bridgeStatusInfo) {
+        TeleinfoAbstractControllerHandler controllerHandler = getControllerHandler();
         if (bridgeStatusInfo.getStatus() != ThingStatus.ONLINE) {
+            if (controllerHandler != null) {
+                controllerHandler.removeListener(this);
+            }
             updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.BRIDGE_OFFLINE, ERROR_OFFLINE_CONTROLLER_OFFLINE);
             return;
         }
 
-        Bridge bridge = getBridge();
-        if (bridge != null) {
-            TeleinfoAbstractControllerHandler controllerHandler = (TeleinfoAbstractControllerHandler) bridge
-                    .getHandler();
-            if (controllerHandler != null) {
-                controllerHandler.addListener(this);
-                updateStatus(ThingStatus.ONLINE);
-            }
+        if (controllerHandler != null) {
+            controllerHandler.addListener(this);
+            updateStatus(ThingStatus.ONLINE);
         }
     }
 
+    @Override
+    public void dispose() {
+        TeleinfoAbstractControllerHandler controllerHandler = getControllerHandler();
+        if (controllerHandler != null) {
+            controllerHandler.removeListener(this);
+        }
+        super.dispose();
+    }
+
+    private @Nullable TeleinfoAbstractControllerHandler getControllerHandler() {
+        Bridge bridge = getBridge();
+        return bridge != null ? (TeleinfoAbstractControllerHandler) bridge.getHandler() : null;
+    }
+
     @Override
     public void handleCommand(ChannelUID channelUID, Command command) {
         // no commands supported