summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Blasche <alexander.blasche@qt.io>2018-10-17 12:58:02 +0200
committerKarsten Heimrich <karsten.heimrich@qt.io>2018-10-29 07:02:03 +0000
commit834258bb3d17638e8e3dc2eca2a3115006c092fd (patch)
treed97b22efac7d5a5f8e8e9dbb610e6f76450152b9
parentdf179c4c18d8feeef48e38cc76cd2a0395ba5de1 (diff)
Ensure QModbusReply::finished() is emitted after disconnect from serial
If the user or remote end closed the serial connection while a QModbusReply is currently pending the reply was never concluded by emitting the finished() or error() signal. QModbusReply::setError() emits both signals. Fixes: QTBUG-68543 Change-Id: Ic93194b0bf28b7147934452889de8c9aa55ff983 Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io>
-rw-r--r--src/serialbus/qmodbusrtuserialmaster.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/serialbus/qmodbusrtuserialmaster.cpp b/src/serialbus/qmodbusrtuserialmaster.cpp
index 1db43a9..99006f4 100644
--- a/src/serialbus/qmodbusrtuserialmaster.cpp
+++ b/src/serialbus/qmodbusrtuserialmaster.cpp
@@ -150,18 +150,24 @@ void QModbusRtuSerialMaster::close()
if (d->m_serialPort->isOpen())
d->m_serialPort->close();
- if (d->m_queue.count())
- qCDebug(QT_MODBUS_LOW) << "(RTU client) Aborted replies:" << d->m_queue.count();
+ // enqueue current active request back for abortion
+ d->m_queue.enqueue(d->m_current);
+ d->m_current = QModbusClientPrivate::QueueElement();
+ int numberOfAborts = 0;
while (!d->m_queue.isEmpty()) {
// Finish each open reply and forget them
QModbusRtuSerialMasterPrivate::QueueElement elem = d->m_queue.dequeue();
if (!elem.reply.isNull()) {
elem.reply->setError(QModbusDevice::ReplyAbortedError,
QModbusClient::tr("Reply aborted due to connection closure."));
+ numberOfAborts++;
}
}
+ if (numberOfAborts > 0)
+ qCDebug(QT_MODBUS_LOW) << "(RTU client) Aborted replies:" << numberOfAborts;
+
setState(QModbusDevice::UnconnectedState);
}