From 3e50af83a3b3a77bd05e17cc7b015386be554baa Mon Sep 17 00:00:00 2001 From: Boernsman Date: Wed, 9 Dec 2020 09:57:24 +0100 Subject: [PATCH] fixed rediscovery memory leak --- .../integrationpluginmodbuscommander.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/modbuscommander/integrationpluginmodbuscommander.cpp b/modbuscommander/integrationpluginmodbuscommander.cpp index e8462ec..0057354 100644 --- a/modbuscommander/integrationpluginmodbuscommander.cpp +++ b/modbuscommander/integrationpluginmodbuscommander.cpp @@ -67,7 +67,6 @@ void IntegrationPluginModbusCommander::init() void IntegrationPluginModbusCommander::discoverThings(ThingDiscoveryInfo *info) { ThingClassId thingClassId = info->thingClassId(); - if (thingClassId == modbusRTUClientThingClassId) { Q_FOREACH(QSerialPortInfo port, QSerialPortInfo::availablePorts()) { qCDebug(dcModbusCommander()) << "Found serial port:" << port.systemLocation() << "manufacturer" << port.manufacturer() << "description" << port.description() << "serial number" << port.serialNumber(); @@ -91,7 +90,7 @@ void IntegrationPluginModbusCommander::discoverThings(ThingDiscoveryInfo *info) qCDebug(dcModbusCommander()) << " - Serial number" << serialnumber; Q_FOREACH (Thing *exisingThing, myThings().filterByParam(modbusRTUClientThingClassId)) { thingDescriptor.setThingId(exisingThing->id()); - // Rediscovery is broken because of an missing unique device id + // Rediscovery is broken because of a missing unique device id // This is a workaround and doesnt work if multiple uart converters are attached. // ThingDiscoveryInfo may be extended to distinquish between discovery and rediscovery break; @@ -183,8 +182,13 @@ void IntegrationPluginModbusCommander::setupThing(ThingSetupInfo *info) uint numberOfRetries = thing->setting(modbusTCPClientSettingsNumberOfRetriesParamTypeId).toUInt(); uint timeout = thing->setting(modbusTCPClientSettingsTimeoutParamTypeId).toUInt(); + if (m_modbusTCPMasters.contains(thing)) { + // In case of a rediscovery + m_modbusTCPMasters.take(thing)->deleteLater(); + } + foreach (ModbusTCPMaster *modbusTCPMaster, m_modbusTCPMasters.values()) { - if ((modbusTCPMaster->hostAddress() == hostAddress) && (modbusTCPMaster->port() == port)){ + if ((modbusTCPMaster->hostAddress() == hostAddress) && (modbusTCPMaster->port() == port)) { m_modbusTCPMasters.insert(thing, modbusTCPMaster); return info->finish(Thing::ThingErrorNoError); } @@ -246,6 +250,12 @@ void IntegrationPluginModbusCommander::setupThing(ThingSetupInfo *info) qCDebug(dcModbusCommander()) << " number of retries:" << numberOfRetries; qCDebug(dcModbusCommander()) << " timeout:" << timeout; + + if (m_modbusRTUMasters.contains(thing)) { + // In case of a rediscovery + m_modbusRTUMasters.take(thing)->deleteLater(); + } + ModbusRTUMaster *modbusRTUMaster = new ModbusRTUMaster(serialPort, baudrate, parity, dataBits, stopBits, this); modbusRTUMaster->setTimeout(timeout); modbusRTUMaster->setNumberOfRetries(numberOfRetries);