summaryrefslogtreecommitdiffstats
path: root/src/network/socket
diff options
context:
space:
mode:
authorLouai Al-Khanji <louai.al-khanji@theqtcompany.com>2015-10-19 15:25:02 +0300
committerLouai Al-Khanji <louai.al-khanji@theqtcompany.com>2016-02-03 03:04:40 +0000
commita0f9ee5dca8e5482fb43583c6a6bdf731e3bcc5a (patch)
tree5da942afa61ee6ed19cc2af5e24a8eb944390953 /src/network/socket
parentd28bb50b253a13fcc837a66ebe527583426ce45e (diff)
Unix platforms: Use qt_safe_poll in QLocalServer
Change-Id: If9f0c1a0089b16729c20c0e05feca58a514d3e25 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/network/socket')
-rw-r--r--src/network/socket/qlocalserver_unix.cpp41
1 files changed, 28 insertions, 13 deletions
diff --git a/src/network/socket/qlocalserver_unix.cpp b/src/network/socket/qlocalserver_unix.cpp
index d407b13cfb..98fdf2fff2 100644
--- a/src/network/socket/qlocalserver_unix.cpp
+++ b/src/network/socket/qlocalserver_unix.cpp
@@ -283,24 +283,39 @@ void QLocalServerPrivate::_q_onNewConnection()
void QLocalServerPrivate::waitForNewConnection(int msec, bool *timedOut)
{
- fd_set readfds;
- FD_ZERO(&readfds);
- FD_SET(listenSocket, &readfds);
+ struct timespec tv, *ptv = nullptr;
- struct timespec timeout;
- timeout.tv_sec = msec / 1000;
- timeout.tv_nsec = (msec % 1000) * 1000 * 1000;
+ if (msec >= 0) {
+ tv.tv_sec = msec / 1000;
+ tv.tv_nsec = (msec % 1000) * 1000 * 1000;
+ ptv = &tv;
+ }
+
+ struct pollfd pfd;
+ pfd.fd = listenSocket;
+ pfd.events = POLLIN;
+ pfd.revents = 0;
+
+ switch (qt_safe_poll(&pfd, 1, ptv)) {
+ case 0:
+ if (timedOut)
+ *timedOut = true;
- int result = -1;
- result = qt_safe_select(listenSocket + 1, &readfds, 0, 0, (msec == -1) ? 0 : &timeout);
- if (-1 == result) {
+ return;
+ break;
+ default:
+ if ((pfd.revents & POLLNVAL) == 0) {
+ _q_onNewConnection();
+ return;
+ }
+
+ errno = EBADF;
+ // FALLTHROUGH
+ case -1:
setError(QLatin1String("QLocalServer::waitForNewConnection"));
closeServer();
+ break;
}
- if (result > 0)
- _q_onNewConnection();
- if (timedOut)
- *timedOut = (result == 0);
}
void QLocalServerPrivate::setError(const QString &function)