diff options
author | Denis Shienkov <denis.shienkov@gmail.com> | 2014-11-22 00:14:12 +0300 |
---|---|---|
committer | Denis Shienkov <denis.shienkov@gmail.com> | 2014-11-28 12:59:05 +0100 |
commit | 3ebd455163edbcb152eef475e4718362833a3581 (patch) | |
tree | 24410b9c8b2a8183162ee761ed27df81f6ddb50b | |
parent | e54305ffde1f5e8d02687ce9ddae55f8128de32d (diff) | |
download | qtserialport-3ebd455163edbcb152eef475e4718362833a3581.tar.gz |
Simplify and improve the QSP::TimeoutError handling
It is reasonable to get rid of duplicating a code of TimeoutError
handling. A common parts of a code can be moved to one place.
Also, can be improved some of related if/else conditions.
Tested on Windows 8 and Linux with virtual serial ports.
Change-Id: I63112727faf42d4357f64f3450ea422167eaee90
Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
-rw-r--r-- | src/serialport/qserialport_unix.cpp | 27 | ||||
-rw-r--r-- | src/serialport/qserialport_unix_p.h | 2 | ||||
-rw-r--r-- | src/serialport/qserialport_win.cpp | 29 | ||||
-rw-r--r-- | src/serialport/qserialport_win_p.h | 2 | ||||
-rw-r--r-- | src/serialport/qserialport_wince.cpp | 15 | ||||
-rw-r--r-- | src/serialport/qserialport_wince_p.h | 2 |
6 files changed, 21 insertions, 56 deletions
diff --git a/src/serialport/qserialport_unix.cpp b/src/serialport/qserialport_unix.cpp index 67e8caf..2a990c9 100644 --- a/src/serialport/qserialport_unix.cpp +++ b/src/serialport/qserialport_unix.cpp @@ -380,19 +380,14 @@ qint64 QSerialPortPrivate::readData(char *data, qint64 maxSize) bool QSerialPortPrivate::waitForReadyRead(int msecs) { - Q_Q(QSerialPort); - QElapsedTimer stopWatch; stopWatch.start(); do { bool readyToRead = false; bool readyToWrite = false; - bool timedOut = false; if (!waitForReadOrWrite(&readyToRead, &readyToWrite, true, !writeBuffer.isEmpty(), - timeoutValue(msecs, stopWatch.elapsed()), &timedOut)) { - if (!timedOut) - q->setError(decodeSystemError()); + timeoutValue(msecs, stopWatch.elapsed()))) { return false; } @@ -407,8 +402,6 @@ bool QSerialPortPrivate::waitForReadyRead(int msecs) bool QSerialPortPrivate::waitForBytesWritten(int msecs) { - Q_Q(QSerialPort); - if (writeBuffer.isEmpty() && pendingBytesWritten <= 0) return false; @@ -418,11 +411,8 @@ bool QSerialPortPrivate::waitForBytesWritten(int msecs) forever { bool readyToRead = false; bool readyToWrite = false; - bool timedOut = false; if (!waitForReadOrWrite(&readyToRead, &readyToWrite, true, !writeBuffer.isEmpty(), - timeoutValue(msecs, stopWatch.elapsed()), &timedOut)) { - if (!timedOut) - q->setError(decodeSystemError()); + timeoutValue(msecs, stopWatch.elapsed()))) { return false; } @@ -992,13 +982,12 @@ void QSerialPortPrivate::setWriteNotificationEnabled(bool enable) bool QSerialPortPrivate::waitForReadOrWrite(bool *selectForRead, bool *selectForWrite, bool checkRead, bool checkWrite, - int msecs, bool *timedOut) + int msecs) { Q_Q(QSerialPort); Q_ASSERT(selectForRead); Q_ASSERT(selectForWrite); - Q_ASSERT(timedOut); fd_set fdread; FD_ZERO(&fdread); @@ -1014,19 +1003,19 @@ bool QSerialPortPrivate::waitForReadOrWrite(bool *selectForRead, bool *selectFor tv.tv_sec = msecs / 1000; tv.tv_usec = (msecs % 1000) * 1000; - int ret = ::select(descriptor + 1, &fdread, &fdwrite, 0, msecs < 0 ? 0 : &tv); - if (ret < 0) + const int ret = ::select(descriptor + 1, &fdread, &fdwrite, 0, msecs < 0 ? 0 : &tv); + if (ret < 0) { + q->setError(decodeSystemError()); return false; + } if (ret == 0) { - *timedOut = true; q->setError(QSerialPort::TimeoutError); return false; } *selectForRead = FD_ISSET(descriptor, &fdread); *selectForWrite = FD_ISSET(descriptor, &fdwrite); - - return ret; + return true; } qint64 QSerialPortPrivate::readFromPort(char *data, qint64 maxSize) diff --git a/src/serialport/qserialport_unix_p.h b/src/serialport/qserialport_unix_p.h index f1821ea..75e6004 100644 --- a/src/serialport/qserialport_unix_p.h +++ b/src/serialport/qserialport_unix_p.h @@ -174,7 +174,7 @@ private: bool waitForReadOrWrite(bool *selectForRead, bool *selectForWrite, bool checkRead, bool checkWrite, - int msecs, bool *timedOut); + int msecs); qint64 readFromPort(char *data, qint64 maxSize); qint64 writeToPort(const char *data, qint64 maxSize); diff --git a/src/serialport/qserialport_win.cpp b/src/serialport/qserialport_win.cpp index 4c8ad07..fabfac2 100644 --- a/src/serialport/qserialport_win.cpp +++ b/src/serialport/qserialport_win.cpp @@ -338,8 +338,6 @@ qint64 QSerialPortPrivate::readData(char *data, qint64 maxSize) bool QSerialPortPrivate::waitForReadyRead(int msecs) { - Q_Q(QSerialPort); - if (!writeStarted && !_q_startAsyncWrite()) return false; @@ -350,15 +348,9 @@ bool QSerialPortPrivate::waitForReadyRead(int msecs) stopWatch.start(); do { - bool timedOut = false; HANDLE triggeredEvent = 0; - - if (!waitAnyEvent(timeoutValue(msecs, stopWatch.elapsed()), &timedOut, &triggeredEvent) || !triggeredEvent) { - // This is occur timeout or another error - if (!timedOut) - q->setError(decodeSystemError()); + if (!waitAnyEvent(timeoutValue(msecs, stopWatch.elapsed()), &triggeredEvent) || !triggeredEvent) return false; - } if (triggeredEvent == communicationOverlapped.hEvent) { if (!_q_completeAsyncCommunication()) @@ -389,8 +381,6 @@ bool QSerialPortPrivate::waitForReadyRead(int msecs) bool QSerialPortPrivate::waitForBytesWritten(int msecs) { - Q_Q(QSerialPort); - if (writeBuffer.isEmpty()) return false; @@ -401,14 +391,9 @@ bool QSerialPortPrivate::waitForBytesWritten(int msecs) stopWatch.start(); forever { - bool timedOut = false; HANDLE triggeredEvent = 0; - - if (!waitAnyEvent(timeoutValue(msecs, stopWatch.elapsed()), &timedOut, &triggeredEvent) || !triggeredEvent) { - if (!timedOut) - q->setError(decodeSystemError()); + if (!waitAnyEvent(timeoutValue(msecs, stopWatch.elapsed()), &triggeredEvent) || !triggeredEvent) return false; - } if (triggeredEvent == communicationOverlapped.hEvent) { if (!_q_completeAsyncCommunication()) @@ -882,12 +867,10 @@ QSerialPort::SerialPortError QSerialPortPrivate::decodeSystemError() const return error; } -bool QSerialPortPrivate::waitAnyEvent(int msecs, bool *timedOut, HANDLE *triggeredEvent) +bool QSerialPortPrivate::waitAnyEvent(int msecs, HANDLE *triggeredEvent) { Q_Q(QSerialPort); - Q_ASSERT(timedOut); - QVector<HANDLE> handles = QVector<HANDLE>() << communicationOverlapped.hEvent << readCompletionOverlapped.hEvent @@ -898,13 +881,13 @@ bool QSerialPortPrivate::waitAnyEvent(int msecs, bool *timedOut, HANDLE *trigger FALSE, // wait any event msecs == -1 ? INFINITE : msecs); if (waitResult == WAIT_TIMEOUT) { - *timedOut = true; q->setError(QSerialPort::TimeoutError, qt_error_string(WAIT_TIMEOUT)); return false; } - - if (waitResult >= DWORD(WAIT_OBJECT_0 + handles.count())) + if (waitResult >= DWORD(WAIT_OBJECT_0 + handles.count())) { + q->setError(decodeSystemError()); return false; + } *triggeredEvent = handles.at(waitResult - WAIT_OBJECT_0); return true; diff --git a/src/serialport/qserialport_win_p.h b/src/serialport/qserialport_win_p.h index 4af0ba4..b4097ff 100644 --- a/src/serialport/qserialport_win_p.h +++ b/src/serialport/qserialport_win_p.h @@ -141,7 +141,7 @@ private: bool updateCommTimeouts(); qint64 overlappedResult(OVERLAPPED &overlapped); - bool waitAnyEvent(int msecs, bool *timedOut, HANDLE *triggeredEvent); + bool waitAnyEvent(int msecs, HANDLE *triggeredEvent); }; diff --git a/src/serialport/qserialport_wince.cpp b/src/serialport/qserialport_wince.cpp index 04c09b1..d7441e6 100644 --- a/src/serialport/qserialport_wince.cpp +++ b/src/serialport/qserialport_wince.cpp @@ -353,11 +353,9 @@ bool QSerialPortPrivate::waitForReadyRead(int msec) forever { bool readyToRead = false; bool readyToWrite = false; - bool timedOut = false; if (!waitForReadOrWrite(&readyToRead, &readyToWrite, true, !writeBuffer.isEmpty(), - timeoutValue(msec, stopWatch.elapsed()), - &timedOut)) { + timeoutValue(msec, stopWatch.elapsed()))) { return false; } if (readyToRead) { @@ -381,11 +379,9 @@ bool QSerialPortPrivate::waitForBytesWritten(int msec) forever { bool readyToRead = false; bool readyToWrite = false; - bool timedOut = false; if (!waitForReadOrWrite(&readyToRead, &readyToWrite, true, !writeBuffer.isEmpty(), - timeoutValue(msec, stopWatch.elapsed()), - &timedOut)) { + timeoutValue(msec, stopWatch.elapsed()))) { return false; } if (readyToRead) { @@ -733,7 +729,7 @@ QSerialPort::SerialPortError QSerialPortPrivate::decodeSystemError() const bool QSerialPortPrivate::waitForReadOrWrite(bool *selectForRead, bool *selectForWrite, bool checkRead, bool checkWrite, - int msecs, bool *timedOut) + int msecs) { Q_Q(QSerialPort); @@ -746,11 +742,8 @@ bool QSerialPortPrivate::waitForReadOrWrite(bool *selectForRead, bool *selectFor breaker.stop(); if (breaker.isWorked()) { - *timedOut = true; q->setError(QSerialPort::TimeoutError); - } - - if (!breaker.isWorked()) { + } else { if (checkRead) { Q_ASSERT(selectForRead); *selectForRead = eventMask & EV_RXCHAR; diff --git a/src/serialport/qserialport_wince_p.h b/src/serialport/qserialport_wince_p.h index 3fc4e23..57977f1 100644 --- a/src/serialport/qserialport_wince_p.h +++ b/src/serialport/qserialport_wince_p.h @@ -121,7 +121,7 @@ private: bool waitForReadOrWrite(bool *selectForRead, bool *selectForWrite, bool checkRead, bool checkWrite, - int msecs, bool *timedOut); + int msecs); }; |