summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan Solovev <ivan.solovev@qt.io>2023-02-07 18:06:43 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-02-09 13:25:40 +0000
commitb53ca3287d2aafd98249d2851152c917845da5e3 (patch)
tree971a965a730c5f775639730b8496208a7ea587db
parent9d02a14d7ee2b5e78d0f4edcfa89067e275786ab (diff)
QModbusTcpServer: do not store client sockets in a separate list
The 'connections' list was used only for tracking who is connected. We can just call QObject::findChildren<QTcpSocket *> on the QTcpServer instance for that. This also fixes the issue with removing data from the container while iterating over it. The old code was also removing the data from the container while iterating over it, because calling socket->disconnectFromHost() from a ranged-for loop results in sending a QTcpSocket::disconnected() signal and immediately calling the connected lambda. This patch fixes the issue. Change-Id: I24d8c197545162af232d438d0941faba6ffc94d0 Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io> (cherry picked from commit a18c97f1a897e4653a47a45976d78bea5a2243be) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/serialbus/qmodbustcpserver.cpp4
-rw-r--r--src/serialbus/qmodbustcpserver_p.h5
2 files changed, 3 insertions, 6 deletions
diff --git a/src/serialbus/qmodbustcpserver.cpp b/src/serialbus/qmodbustcpserver.cpp
index 715c55c..ad7e2e5 100644
--- a/src/serialbus/qmodbustcpserver.cpp
+++ b/src/serialbus/qmodbustcpserver.cpp
@@ -98,7 +98,9 @@ void QModbusTcpServer::close()
if (d->m_tcpServer->isListening())
d->m_tcpServer->close();
- for (auto socket : std::as_const(d->connections))
+ const auto childSockets =
+ d->m_tcpServer->findChildren<QTcpSocket *>(Qt::FindDirectChildrenOnly);
+ for (auto socket : childSockets)
socket->disconnectFromHost();
setState(QModbusDevice::UnconnectedState);
diff --git a/src/serialbus/qmodbustcpserver_p.h b/src/serialbus/qmodbustcpserver_p.h
index 0f1cbfe..f7c392f 100644
--- a/src/serialbus/qmodbustcpserver_p.h
+++ b/src/serialbus/qmodbustcpserver_p.h
@@ -99,8 +99,6 @@ public:
return;
}
- connections.append(socket);
-
auto buffer = new QByteArray();
QObject::connect(socket, &QObject::destroyed, socket, [buffer]() {
@@ -108,8 +106,6 @@ public:
delete buffer;
});
QObject::connect(socket, &QTcpSocket::disconnected, q, [socket, this]() {
- connections.removeAll(socket);
-
Q_Q(QModbusTcpServer);
emit q->modbusClientDisconnected(socket);
socket->deleteLater();
@@ -193,7 +189,6 @@ public:
}
QTcpServer *m_tcpServer { nullptr };
- QList<QTcpSocket *> connections;
std::unique_ptr<QModbusTcpConnectionObserver> m_observer;