diff options
author | Alex Blasche <alexander.blasche@qt.io> | 2018-10-17 12:58:02 +0200 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@qt.io> | 2018-10-29 07:02:03 +0000 |
commit | 834258bb3d17638e8e3dc2eca2a3115006c092fd (patch) | |
tree | d97b22efac7d5a5f8e8e9dbb610e6f76450152b9 | |
parent | df179c4c18d8feeef48e38cc76cd2a0395ba5de1 (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.cpp | 10 |
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); } |