diff options
author | Louai Al-Khanji <louai.al-khanji@theqtcompany.com> | 2015-10-19 15:25:02 +0300 |
---|---|---|
committer | Louai Al-Khanji <louai.al-khanji@theqtcompany.com> | 2016-02-03 03:04:40 +0000 |
commit | a0f9ee5dca8e5482fb43583c6a6bdf731e3bcc5a (patch) | |
tree | 5da942afa61ee6ed19cc2af5e24a8eb944390953 /src/network/socket | |
parent | d28bb50b253a13fcc837a66ebe527583426ce45e (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.cpp | 41 |
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) |