From e5866d86917118448876f705cdfd069b380ac9d7 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Wed, 22 Sep 2021 19:45:54 +0300 Subject: [PATCH] generalize qt_safe_poll() implementation and use it QProcessPrivate::waitForStarted() Signed-off-by: Ivailo Monev --- src/core/io/qprocess_unix.cpp | 9 +++++---- src/core/kernel/qcore_unix_p.h | 11 +++-------- src/network/socket/qlocalserver_unix.cpp | 7 +++++-- src/network/socket/qlocalsocket_unix.cpp | 7 +++++-- src/network/socket/qnativesocketengine_unix.cpp | 23 ++++++++++++++--------- 5 files changed, 32 insertions(+), 25 deletions(-) diff --git a/src/core/io/qprocess_unix.cpp b/src/core/io/qprocess_unix.cpp index 719e4fbdb..dcc1dc752 100644 --- a/src/core/io/qprocess_unix.cpp +++ b/src/core/io/qprocess_unix.cpp @@ -793,10 +793,11 @@ bool QProcessPrivate::waitForStarted(int msecs) childStartedPipe[0]); #endif - fd_set fds; - FD_ZERO(&fds); - FD_SET(childStartedPipe[0], &fds); - if (select_msecs(childStartedPipe[0] + 1, &fds, 0, msecs) == 0) { + struct pollfd fds; + ::memset(&fds, 0, sizeof(struct pollfd)); + fds.fd = childStartedPipe[0]; + fds.events = POLLIN; + if (qt_safe_poll(&fds, 1, msecs) == 0) { processError = QProcess::Timedout; q->setErrorString(QProcess::tr("Process operation timed out")); #if defined (QPROCESS_DEBUG) diff --git a/src/core/kernel/qcore_unix_p.h b/src/core/kernel/qcore_unix_p.h index 8c8ab1087..ee6794835 100644 --- a/src/core/kernel/qcore_unix_p.h +++ b/src/core/kernel/qcore_unix_p.h @@ -258,19 +258,14 @@ static inline pid_t qt_safe_waitpid(pid_t pid, int *status, int options) } // don't call ::poll, call qt_safe_poll -static inline int qt_safe_poll(int fd, int events, int timeout, int *revents) +static inline int qt_safe_poll(struct pollfd *fds, nfds_t nfds, int timeout) { - struct pollfd pd; - ::memset(&pd, 0, sizeof(struct pollfd)); - pd.fd = fd; - pd.events = events; int ret; - Q_EINTR_LOOP(ret, ::poll(&pd, 1, timeout)); - if ((pd.revents & POLLERR) != 0 || (pd.revents & POLLHUP) != 0 || (pd.revents & POLLNVAL) != 0) { + Q_EINTR_LOOP(ret, ::poll(fds, nfds, timeout)); + if ((fds->revents & POLLERR) != 0 || (fds->revents & POLLHUP) != 0 || (fds->revents & POLLNVAL) != 0) { // select() compat return -1; } - *revents = pd.revents; return ret; } diff --git a/src/network/socket/qlocalserver_unix.cpp b/src/network/socket/qlocalserver_unix.cpp index 5c6d72114..f8376650e 100644 --- a/src/network/socket/qlocalserver_unix.cpp +++ b/src/network/socket/qlocalserver_unix.cpp @@ -162,8 +162,11 @@ void QLocalServerPrivate::_q_onNewConnection() void QLocalServerPrivate::waitForNewConnection(int msec, bool *timedOut) { - int revents = 0; - int result = qt_safe_poll(listenSocket, POLLIN, msec, &revents); + struct pollfd fds; + ::memset(&fds, 0, sizeof(struct pollfd)); + fds.fd = listenSocket; + fds.events = POLLIN; + int result = qt_safe_poll(&fds, 1, msec); if (result == -1) { setError(QLatin1String("QLocalServer::waitForNewConnection")); closeServer(); diff --git a/src/network/socket/qlocalsocket_unix.cpp b/src/network/socket/qlocalsocket_unix.cpp index 8d0bc40a7..f0f0fe7c9 100644 --- a/src/network/socket/qlocalsocket_unix.cpp +++ b/src/network/socket/qlocalsocket_unix.cpp @@ -505,8 +505,11 @@ bool QLocalSocket::waitForConnected(int msec) if (msec == 0) msec = 1000; - int revents = 0; - int result = qt_safe_poll(d->connectingSocket, POLLIN, msec, &revents); + struct pollfd fds; + ::memset(&fds, 0, sizeof(struct pollfd)); + fds.fd = d->connectingSocket; + fds.events = POLLIN; + int result = qt_safe_poll(&fds, 1, msec); if (result == -1) { d->errorOccurred( QLocalSocket::UnknownSocketError, QLatin1String("QLocalSocket::waitForConnected")); diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp index 53fc9162d..40722ae51 100644 --- a/src/network/socket/qnativesocketengine_unix.cpp +++ b/src/network/socket/qnativesocketengine_unix.cpp @@ -987,26 +987,31 @@ qint64 QNativeSocketEnginePrivate::nativeRead(char *data, qint64 maxSize) int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool selectForRead) const { - int revents = 0; - return qt_safe_poll(socketDescriptor, selectForRead ? POLLIN : POLLOUT, timeout, &revents); + struct pollfd fds; + ::memset(&fds, 0, sizeof(struct pollfd)); + fds.fd = socketDescriptor; + fds.events = (selectForRead ? POLLIN : POLLOUT); + return qt_safe_poll(&fds, 1, timeout); } int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool checkRead, bool checkWrite, bool *selectForRead, bool *selectForWrite) const { - int events = 0; + struct pollfd fds; + ::memset(&fds, 0, sizeof(struct pollfd)); + fds.fd = socketDescriptor; + fds.events = 0; if (checkRead) { - events |= POLLIN; + fds.events |= POLLIN; } if (checkWrite) { - events |= POLLOUT; + fds.events |= POLLOUT; } - int revents = 0; - int ret = qt_safe_poll(socketDescriptor, events, timeout, &revents); + int ret = qt_safe_poll(&fds, 1, timeout); if (ret > 0) { - *selectForRead = ((revents & POLLIN) != 0); - *selectForWrite = ((revents & POLLOUT) != 0); + *selectForRead = ((fds.revents & POLLIN) != 0); + *selectForWrite = ((fds.revents & POLLOUT) != 0); } return ret; } -- 2.11.0