summaryrefslogtreecommitdiffstats
path: root/src/network/socket/qnativesocketengine_unix.cpp
diff options
context:
space:
mode:
authorLouai Al-Khanji <louai.al-khanji@theqtcompany.com>2015-10-19 12:56:31 +0300
committerLouai Al-Khanji <louai.al-khanji@theqtcompany.com>2016-02-03 03:04:37 +0000
commitd28bb50b253a13fcc837a66ebe527583426ce45e (patch)
tree9ce3c44c9fcaaa04a0a3ae2c81437ca1926c2f89 /src/network/socket/qnativesocketengine_unix.cpp
parentd3e6e732c70ebc2340d6376d727b3c623be23810 (diff)
Unix platforms: Use poll in native socket engine instead of select
Change-Id: I10fde9f446ee17c921ce9cf356a27daac396321d Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/network/socket/qnativesocketengine_unix.cpp')
-rw-r--r--src/network/socket/qnativesocketengine_unix.cpp58
1 files changed, 29 insertions, 29 deletions
diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp
index 1b7dfe53ff..ed94808a54 100644
--- a/src/network/socket/qnativesocketengine_unix.cpp
+++ b/src/network/socket/qnativesocketengine_unix.cpp
@@ -1202,47 +1202,47 @@ qint64 QNativeSocketEnginePrivate::nativeRead(char *data, qint64 maxSize)
int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool selectForRead) const
{
- fd_set fds;
- FD_ZERO(&fds);
- FD_SET(socketDescriptor, &fds);
-
- struct timespec tv;
- tv.tv_sec = timeout / 1000;
- tv.tv_nsec = (timeout % 1000) * 1000 * 1000;
-
- int retval;
- if (selectForRead)
- retval = qt_safe_select(socketDescriptor + 1, &fds, 0, 0, timeout < 0 ? 0 : &tv);
- else
- retval = qt_safe_select(socketDescriptor + 1, 0, &fds, 0, timeout < 0 ? 0 : &tv);
-
- return retval;
+ bool dummy;
+ return nativeSelect(timeout, selectForRead, !selectForRead, &dummy, &dummy);
}
int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool checkWrite,
bool *selectForRead, bool *selectForWrite) const
{
- fd_set fdread;
- FD_ZERO(&fdread);
+ struct timespec tv, *ptv = nullptr;
+
+ if (timeout >= 0) {
+ tv.tv_sec = timeout / 1000;
+ tv.tv_nsec = (timeout % 1000) * 1000 * 1000;
+ ptv = &tv;
+ }
+
+ struct pollfd pfd;
+ pfd.fd = socketDescriptor;
+ pfd.events = 0;
+ pfd.revents = 0;
+
if (checkRead)
- FD_SET(socketDescriptor, &fdread);
+ pfd.events |= POLLIN;
- fd_set fdwrite;
- FD_ZERO(&fdwrite);
if (checkWrite)
- FD_SET(socketDescriptor, &fdwrite);
+ pfd.events |= POLLOUT;
- struct timespec tv;
- tv.tv_sec = timeout / 1000;
- tv.tv_nsec = (timeout % 1000) * 1000 * 1000;
-
- int ret;
- ret = qt_safe_select(socketDescriptor + 1, &fdread, &fdwrite, 0, timeout < 0 ? 0 : &tv);
+ const int ret = qt_safe_poll(&pfd, 1, ptv);
if (ret <= 0)
return ret;
- *selectForRead = FD_ISSET(socketDescriptor, &fdread);
- *selectForWrite = FD_ISSET(socketDescriptor, &fdwrite);
+
+ if (pfd.revents & POLLNVAL) {
+ errno = EBADF;
+ return -1;
+ }
+
+ static const short read_flags = POLLIN | POLLHUP | POLLERR;
+ static const short write_flags = POLLOUT | POLLERR;
+
+ *selectForRead = ((pfd.revents & read_flags) != 0);
+ *selectForWrite = ((pfd.revents & write_flags) != 0);
return ret;
}