summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLouai Al-Khanji <louai.al-khanji@theqtcompany.com>2016-02-03 23:06:40 -0800
committerLouai Al-Khanji <louai.al-khanji@theqtcompany.com>2016-02-05 00:29:49 +0000
commite5c93da50f3b05d312f0e3dec50baf9fcbd5ffdc (patch)
tree44f8f6903ac0e95c45e60f9f9ff1b7b3c5cb446a
parent3dea8d0988ebba4b9eea585fde0dd7a8494253a6 (diff)
QSerialPort: Replace select with poll on Unix
Change-Id: I7228af796b440790862d22026fa99f96881e39c0 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r--src/serialport/qserialport_unix.cpp24
1 files changed, 11 insertions, 13 deletions
diff --git a/src/serialport/qserialport_unix.cpp b/src/serialport/qserialport_unix.cpp
index 2e5be567..4d17b7d2 100644
--- a/src/serialport/qserialport_unix.cpp
+++ b/src/serialport/qserialport_unix.cpp
@@ -986,21 +986,15 @@ bool QSerialPortPrivate::waitForReadOrWrite(bool *selectForRead, bool *selectFor
Q_ASSERT(selectForRead);
Q_ASSERT(selectForWrite);
- fd_set fdread;
- FD_ZERO(&fdread);
+ pollfd pfd = qt_make_pollfd(descriptor, 0);
+
if (checkRead)
- FD_SET(descriptor, &fdread);
+ pfd.events |= POLLIN;
- fd_set fdwrite;
- FD_ZERO(&fdwrite);
if (checkWrite)
- FD_SET(descriptor, &fdwrite);
-
- struct timespec tv;
- tv.tv_sec = msecs / 1000;
- tv.tv_nsec = (msecs % 1000) * 1000 * 1000;
+ pfd.events |= POLLOUT;
- const int ret = qt_safe_select(descriptor + 1, &fdread, &fdwrite, 0, msecs < 0 ? 0 : &tv);
+ const int ret = qt_poll_msecs(&pfd, 1, msecs);
if (ret < 0) {
setError(getSystemError());
return false;
@@ -1009,9 +1003,13 @@ bool QSerialPortPrivate::waitForReadOrWrite(bool *selectForRead, bool *selectFor
setError(QSerialPortErrorInfo(QSerialPort::TimeoutError));
return false;
}
+ if (pfd.revents & POLLNVAL) {
+ setError(getSystemError(EBADF));
+ return false;
+ }
- *selectForRead = FD_ISSET(descriptor, &fdread);
- *selectForWrite = FD_ISSET(descriptor, &fdwrite);
+ *selectForWrite = ((pfd.revents & POLLOUT) != 0);
+ *selectForRead = ((pfd.revents & POLLIN) != 0);
return true;
}