summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Shienkov <denis.shienkov@gmail.com>2014-11-22 00:14:12 +0300
committerDenis Shienkov <denis.shienkov@gmail.com>2014-11-28 12:59:05 +0100
commit3ebd455163edbcb152eef475e4718362833a3581 (patch)
tree24410b9c8b2a8183162ee761ed27df81f6ddb50b
parente54305ffde1f5e8d02687ce9ddae55f8128de32d (diff)
downloadqtserialport-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.cpp27
-rw-r--r--src/serialport/qserialport_unix_p.h2
-rw-r--r--src/serialport/qserialport_win.cpp29
-rw-r--r--src/serialport/qserialport_win_p.h2
-rw-r--r--src/serialport/qserialport_wince.cpp15
-rw-r--r--src/serialport/qserialport_wince_p.h2
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);
};