From d866f6e8861647c45f438bc5b21905dacee41f8e Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 24 Dec 2014 17:01:52 -0200 Subject: Save two system calls for setting a socket non-blocking on Linux Linux's socket(2) system call can take SOCK_NONBLOCK and let us avoid the extra two fcntl(2) to change the setting after it's created. Change-Id: Ie0d7a2d51acc21acd850cbee6d0f76e27b1ae859 Reviewed-by: Richard J. Moore --- src/network/socket/qlocalsocket_unix.cpp | 10 +--------- src/network/socket/qnativesocketengine.cpp | 8 -------- src/network/socket/qnativesocketengine_unix.cpp | 4 ++-- src/network/socket/qnativesocketengine_win.cpp | 9 ++++++++- src/network/socket/qnativesocketengine_winrt.cpp | 14 +++++++++++--- 5 files changed, 22 insertions(+), 23 deletions(-) (limited to 'src/network') diff --git a/src/network/socket/qlocalsocket_unix.cpp b/src/network/socket/qlocalsocket_unix.cpp index 57aab2cc77..1f6d42918e 100644 --- a/src/network/socket/qlocalsocket_unix.cpp +++ b/src/network/socket/qlocalsocket_unix.cpp @@ -235,19 +235,11 @@ void QLocalSocket::connectToServer(OpenMode openMode) } // create the socket - if (-1 == (d->connectingSocket = qt_safe_socket(PF_UNIX, SOCK_STREAM, 0))) { + if (-1 == (d->connectingSocket = qt_safe_socket(PF_UNIX, SOCK_STREAM, 0, O_NONBLOCK))) { d->errorOccurred(UnsupportedSocketOperationError, QLatin1String("QLocalSocket::connectToServer")); return; } - // set non blocking so we can try to connect and it won't wait - int flags = fcntl(d->connectingSocket, F_GETFL, 0); - if (-1 == flags - || -1 == (fcntl(d->connectingSocket, F_SETFL, flags | O_NONBLOCK))) { - d->errorOccurred(UnknownSocketError, - QLatin1String("QLocalSocket::connectToServer")); - return; - } // _q_connectToSocket does the actual connecting d->connectingName = d->serverName; diff --git a/src/network/socket/qnativesocketengine.cpp b/src/network/socket/qnativesocketengine.cpp index e7113c8c5e..63f50632d2 100644 --- a/src/network/socket/qnativesocketengine.cpp +++ b/src/network/socket/qnativesocketengine.cpp @@ -357,14 +357,6 @@ bool QNativeSocketEngine::initialize(QAbstractSocket::SocketType socketType, QAb return false; } - // Make the socket nonblocking. - if (!setOption(NonBlockingSocketOption, 1)) { - d->setError(QAbstractSocket::UnsupportedSocketOperationError, - QNativeSocketEnginePrivate::NonBlockingInitFailedErrorString); - close(); - return false; - } - // Set the broadcasting flag if it's a UDP socket. if (socketType == QAbstractSocket::UdpSocket && !setOption(BroadcastSocketOption, 1)) { diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp index eed1b70025..a7534a2f3f 100644 --- a/src/network/socket/qnativesocketengine_unix.cpp +++ b/src/network/socket/qnativesocketengine_unix.cpp @@ -138,10 +138,10 @@ bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType soc int protocol = (socketProtocol == QAbstractSocket::IPv6Protocol || socketProtocol == QAbstractSocket::AnyIPProtocol) ? AF_INET6 : AF_INET; int type = (socketType == QAbstractSocket::UdpSocket) ? SOCK_DGRAM : SOCK_STREAM; - int socket = qt_safe_socket(protocol, type, 0); + int socket = qt_safe_socket(protocol, type, 0, O_NONBLOCK); if (socket < 0 && socketProtocol == QAbstractSocket::AnyIPProtocol && errno == EAFNOSUPPORT) { protocol = AF_INET; - socket = qt_safe_socket(protocol, type, 0); + socket = qt_safe_socket(protocol, type, 0, O_NONBLOCK); socketProtocol = QAbstractSocket::IPv4Protocol; } diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp index 184add15c3..7d62fc3955 100644 --- a/src/network/socket/qnativesocketengine_win.cpp +++ b/src/network/socket/qnativesocketengine_win.cpp @@ -383,8 +383,15 @@ bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType soc #endif socketDescriptor = socket; - return true; + // Make the socket nonblocking. + if (!setOption(QAbstractSocketEngine::NonBlockingSocketOption, 1)) { + setError(QAbstractSocket::UnsupportedSocketOperationError, NonBlockingInitFailedErrorString); + q_func()->close(); + return false; + } + + return true; } /*! \internal diff --git a/src/network/socket/qnativesocketengine_winrt.cpp b/src/network/socket/qnativesocketengine_winrt.cpp index e60840d651..c49eda179a 100644 --- a/src/network/socket/qnativesocketengine_winrt.cpp +++ b/src/network/socket/qnativesocketengine_winrt.cpp @@ -768,7 +768,7 @@ bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType soc return false; } socketDescriptor = qintptr(socket.Detach()); - return true; + break; } case QAbstractSocket::UdpSocket: { ComPtr socket; @@ -780,13 +780,21 @@ bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType soc EventRegistrationToken token; socketDescriptor = qintptr(socket.Detach()); udpSocket()->add_MessageReceived(Callback(this, &QNativeSocketEnginePrivate::handleNewDatagram).Get(), &token); - return true; + break; } default: qWarning("Invalid socket type"); return false; } - return false; + + // Make the socket nonblocking. + if (!setOption(QAbstractSocketEngine::NonBlockingSocketOption, 1)) { + setError(QAbstractSocket::UnsupportedSocketOperationError, NonBlockingInitFailedErrorString); + q_func()->close(); + return false; + } + + return true; } QNativeSocketEnginePrivate::QNativeSocketEnginePrivate() -- cgit v1.2.3