diff options
author | Denis Shienkov <denis.shienkov@gmail.com> | 2015-06-15 22:34:41 +0300 |
---|---|---|
committer | Denis Shienkov <denis.shienkov@gmail.com> | 2015-06-23 18:27:58 +0000 |
commit | b577aeabc42b8df4f8486edf96cf9a90e6fc9f2e (patch) | |
tree | b58d151d73e8a260dd4a6fb95568a52c99a62567 | |
parent | 71c38793265fc2966cde5ef64ef21c4bb122bd0f (diff) | |
download | qtserialport-b577aeabc42b8df4f8486edf96cf9a90e6fc9f2e.tar.gz |
Do not use the queued connection to handle an I/O events on Windows
... that simplifies the code of waitForXX() methods. In this case
we do not need to call the completion methods, because it does the
_q_notified() slot automatically even without an event loop.
Tested with the virtual com0com serial ports, using auto tests
and examples.
Change-Id: I33d6c91d1842fd3eff1673d60e8413d471725f74
Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
-rw-r--r-- | src/serialport/qserialport_p.h | 1 | ||||
-rw-r--r-- | src/serialport/qserialport_win.cpp | 55 |
2 files changed, 4 insertions, 52 deletions
diff --git a/src/serialport/qserialport_p.h b/src/serialport/qserialport_p.h index ad8d9d0..7da2204 100644 --- a/src/serialport/qserialport_p.h +++ b/src/serialport/qserialport_p.h @@ -202,7 +202,6 @@ public: bool initialize(); bool updateDcb(); bool updateCommTimeouts(); - qint64 overlappedResult(OVERLAPPED *overlapped); void handleLineStatusErrors(); OVERLAPPED *waitForNotified(int msecs); diff --git a/src/serialport/qserialport_win.cpp b/src/serialport/qserialport_win.cpp index b3d5c9d..e6e6924 100644 --- a/src/serialport/qserialport_win.cpp +++ b/src/serialport/qserialport_win.cpp @@ -284,14 +284,7 @@ bool QSerialPortPrivate::waitForReadyRead(int msecs) if (!overlapped) return false; - const qint64 bytesTransferred = overlappedResult(overlapped); - - if (overlapped == &communicationOverlapped) { - if (!completeAsyncCommunication(bytesTransferred)) - return false; - } else if (overlapped == &readCompletionOverlapped) { - if (!completeAsyncRead(bytesTransferred)) - return false; + if (overlapped == &readCompletionOverlapped) { const qint64 readBytesForOneReadOperation = qint64(buffer.size()) - currentReadBufferSize; if (readBytesForOneReadOperation == ReadChunkSize) { currentReadBufferSize = buffer.size(); @@ -301,11 +294,6 @@ bool QSerialPortPrivate::waitForReadyRead(int msecs) } else { return true; } - } else if (overlapped == &writeCompletionOverlapped) { - if (!completeAsyncWrite(bytesTransferred)) - return false; - } else { - return false; } } while (msecs == -1 || timeoutValue(msecs, stopWatch.elapsed()) > 0); @@ -329,20 +317,8 @@ bool QSerialPortPrivate::waitForBytesWritten(int msecs) if (!overlapped) return false; - const qint64 bytesTransferred = overlappedResult(overlapped); - - if (overlapped == &communicationOverlapped) { - if (!completeAsyncCommunication(bytesTransferred)) - return false; - } else if (overlapped == &readCompletionOverlapped) { - if (!completeAsyncRead(bytesTransferred)) - return false; - } else if (overlapped == &writeCompletionOverlapped) { - return completeAsyncWrite(bytesTransferred); - } else { - return false; - } - + if (overlapped == &writeCompletionOverlapped) + return true; } return false; @@ -735,8 +711,7 @@ inline bool QSerialPortPrivate::initialize() notifier = new QWinOverlappedIoNotifier(q); q->connect(notifier, SIGNAL(notified(quint32, quint32, OVERLAPPED*)), - q, SLOT(_q_notified(quint32, quint32, OVERLAPPED*)), - Qt::QueuedConnection); + q, SLOT(_q_notified(quint32, quint32, OVERLAPPED*))); notifier->setHandle(handle); notifier->setEnabled(true); @@ -768,28 +743,6 @@ bool QSerialPortPrivate::updateCommTimeouts() return true; } -qint64 QSerialPortPrivate::overlappedResult(OVERLAPPED *overlapped) -{ - Q_Q(QSerialPort); - - DWORD bytesTransferred = 0; - if (!::GetOverlappedResult(handle, overlapped, &bytesTransferred, FALSE)) { - const QSerialPort::SerialPortError error = decodeSystemError(); - if (error == QSerialPort::NoError) - return qint64(0); - if (error != QSerialPort::ResourceError) { - if (overlapped == &readCompletionOverlapped) - q->setError(QSerialPort::ReadError); - else if (overlapped == &writeCompletionOverlapped) - q->setError(QSerialPort::WriteError); - else - q->setError(error); - return qint64(-1); - } - } - return bytesTransferred; -} - QSerialPort::SerialPortError QSerialPortPrivate::decodeSystemError(int systemErrorCode) const { if (systemErrorCode == -1) |