summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Shienkov <denis.shienkov@gmail.com>2015-06-15 22:34:41 +0300
committerDenis Shienkov <denis.shienkov@gmail.com>2015-06-23 18:27:58 +0000
commitb577aeabc42b8df4f8486edf96cf9a90e6fc9f2e (patch)
treeb58d151d73e8a260dd4a6fb95568a52c99a62567
parent71c38793265fc2966cde5ef64ef21c4bb122bd0f (diff)
downloadqtserialport-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.h1
-rw-r--r--src/serialport/qserialport_win.cpp55
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)