Introduce qt_subtract_from_timeout to reduce code duplication.

The same qt_timeout_value function was copied 5 times in qtbase's code,
so provide a common implementation in QIoDevice that can be used by
everyone.

This commit also corrects the remaining time calculation in
QProcess::waitForBytesWritten and QProcess::waitForFinished by using
this new function.

For QProcess::waitForFinished, if the process started within almost exactly
the timeout time passed to waitForFinished, msecs - stopWatch.elapsed() would
be -1, which is a special value.

Change-Id: I7b76ee6bae695eafdd02e3db03e2ff1e23a7f40c
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
This commit is contained in:
Daniel Teske 2014-12-08 15:29:19 +01:00
parent 5bf9528b91
commit ed0c0070f9
11 changed files with 57 additions and 102 deletions

View File

@ -1667,6 +1667,23 @@ QString QIODevice::errorString() const
\sa read(), write() \sa read(), write()
*/ */
/*!
\internal
\fn int qt_subtract_from_timeout(int timeout, int elapsed)
Reduces the \a timeout by \a elapsed, taking into account that -1 is a
special value for timeouts.
*/
int qt_subtract_from_timeout(int timeout, int elapsed)
{
if (timeout == -1)
return -1;
timeout = timeout - elapsed;
return timeout < 0 ? 0 : timeout;
}
#if !defined(QT_NO_DEBUG_STREAM) #if !defined(QT_NO_DEBUG_STREAM)
QDebug operator<<(QDebug debug, QIODevice::OpenMode modes) QDebug operator<<(QDebug debug, QIODevice::OpenMode modes)

View File

@ -60,6 +60,8 @@ QT_BEGIN_NAMESPACE
#define QIODEVICE_BUFFERSIZE Q_INT64_C(16384) #define QIODEVICE_BUFFERSIZE Q_INT64_C(16384)
#endif #endif
Q_CORE_EXPORT int qt_subtract_from_timeout(int timeout, int elapsed);
// This is QIODevice's read buffer, optimized for read(), isEmpty() and getChar() // This is QIODevice's read buffer, optimized for read(), isEmpty() and getChar()
class QIODevicePrivateLinearBuffer class QIODevicePrivateLinearBuffer
{ {

View File

@ -1793,8 +1793,7 @@ bool QProcess::waitForBytesWritten(int msecs)
bool started = waitForStarted(msecs); bool started = waitForStarted(msecs);
if (!started) if (!started)
return false; return false;
if (msecs != -1) msecs = qt_subtract_from_timeout(msecs, stopWatch.elapsed());
msecs -= stopWatch.elapsed();
} }
return d->waitForBytesWritten(msecs); return d->waitForBytesWritten(msecs);
@ -1830,8 +1829,7 @@ bool QProcess::waitForFinished(int msecs)
bool started = waitForStarted(msecs); bool started = waitForStarted(msecs);
if (!started) if (!started)
return false; return false;
if (msecs != -1) msecs = qt_subtract_from_timeout(msecs, stopWatch.elapsed());
msecs -= stopWatch.elapsed();
} }
return d->waitForFinished(msecs); return d->waitForFinished(msecs);

View File

@ -1019,19 +1019,6 @@ void QProcessPrivate::killProcess()
::kill(pid_t(pid), SIGKILL); ::kill(pid_t(pid), SIGKILL);
} }
/*
Returns the difference between msecs and elapsed. If msecs is -1,
however, -1 is returned.
*/
static int qt_timeout_value(int msecs, int elapsed)
{
if (msecs == -1)
return -1;
int timeout = msecs - elapsed;
return timeout < 0 ? 0 : timeout;
}
bool QProcessPrivate::waitForStarted(int msecs) bool QProcessPrivate::waitForStarted(int msecs)
{ {
Q_Q(QProcess); Q_Q(QProcess);
@ -1106,7 +1093,7 @@ bool QProcessPrivate::waitForReadyRead(int msecs)
if (!stdinChannel.buffer.isEmpty() && stdinChannel.pipe[1] != -1) if (!stdinChannel.buffer.isEmpty() && stdinChannel.pipe[1] != -1)
add_fd(nfds, stdinChannel.pipe[1], &fdwrite); add_fd(nfds, stdinChannel.pipe[1], &fdwrite);
int timeout = qt_timeout_value(msecs, stopWatch.elapsed()); int timeout = qt_subtract_from_timeout(msecs, stopWatch.elapsed());
#ifdef Q_OS_BLACKBERRY #ifdef Q_OS_BLACKBERRY
int ret = bb_select(notifiers, nfds + 1, &fdread, &fdwrite, timeout); int ret = bb_select(notifiers, nfds + 1, &fdread, &fdwrite, timeout);
#else #else
@ -1187,7 +1174,7 @@ bool QProcessPrivate::waitForBytesWritten(int msecs)
if (!stdinChannel.buffer.isEmpty() && stdinChannel.pipe[1] != -1) if (!stdinChannel.buffer.isEmpty() && stdinChannel.pipe[1] != -1)
add_fd(nfds, stdinChannel.pipe[1], &fdwrite); add_fd(nfds, stdinChannel.pipe[1], &fdwrite);
int timeout = qt_timeout_value(msecs, stopWatch.elapsed()); int timeout = qt_subtract_from_timeout(msecs, stopWatch.elapsed());
#ifdef Q_OS_BLACKBERRY #ifdef Q_OS_BLACKBERRY
int ret = bb_select(notifiers, nfds + 1, &fdread, &fdwrite, timeout); int ret = bb_select(notifiers, nfds + 1, &fdread, &fdwrite, timeout);
#else #else
@ -1262,7 +1249,7 @@ bool QProcessPrivate::waitForFinished(int msecs)
if (!stdinChannel.buffer.isEmpty() && stdinChannel.pipe[1] != -1) if (!stdinChannel.buffer.isEmpty() && stdinChannel.pipe[1] != -1)
add_fd(nfds, stdinChannel.pipe[1], &fdwrite); add_fd(nfds, stdinChannel.pipe[1], &fdwrite);
int timeout = qt_timeout_value(msecs, stopWatch.elapsed()); int timeout = qt_subtract_from_timeout(msecs, stopWatch.elapsed());
#ifdef Q_OS_BLACKBERRY #ifdef Q_OS_BLACKBERRY
int ret = bb_select(notifiers, nfds + 1, &fdread, &fdwrite, timeout); int ret = bb_select(notifiers, nfds + 1, &fdread, &fdwrite, timeout);
#else #else

View File

@ -41,6 +41,7 @@
#include <qthread.h> #include <qthread.h>
#include <qt_windows.h> #include <qt_windows.h>
#include <private/qobject_p.h> #include <private/qobject_p.h>
#include <private/qiodevice_p.h>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@ -332,11 +333,9 @@ bool QWinOverlappedIoNotifier::waitForNotified(int msecs, OVERLAPPED *overlapped
return false; return false;
if (triggeredOverlapped == overlapped) if (triggeredOverlapped == overlapped)
return true; return true;
if (msecs != -1) { msecs = qt_subtract_from_timeout(msecs, stopWatch.elapsed());
t = msecs - stopWatch.elapsed(); if (t == 0)
if (t < 0) return false;
return false;
}
} }
} }

View File

@ -1976,20 +1976,6 @@ QVariant QAbstractSocket::socketOption(QAbstractSocket::SocketOption option)
return QVariant(ret); return QVariant(ret);
} }
/*
Returns the difference between msecs and elapsed. If msecs is -1,
however, -1 is returned.
*/
static int qt_timeout_value(int msecs, int elapsed)
{
if (msecs == -1)
return -1;
int timeout = msecs - elapsed;
return timeout < 0 ? 0 : timeout;
}
/*! /*!
Waits until the socket is connected, up to \a msecs Waits until the socket is connected, up to \a msecs
milliseconds. If the connection has been established, this milliseconds. If the connection has been established, this
@ -2067,7 +2053,7 @@ bool QAbstractSocket::waitForConnected(int msecs)
int attempt = 1; int attempt = 1;
#endif #endif
while (state() == ConnectingState && (msecs == -1 || stopWatch.elapsed() < msecs)) { while (state() == ConnectingState && (msecs == -1 || stopWatch.elapsed() < msecs)) {
int timeout = qt_timeout_value(msecs, stopWatch.elapsed()); int timeout = qt_subtract_from_timeout(msecs, stopWatch.elapsed());
if (msecs != -1 && timeout > QT_CONNECT_TIMEOUT) if (msecs != -1 && timeout > QT_CONNECT_TIMEOUT)
timeout = QT_CONNECT_TIMEOUT; timeout = QT_CONNECT_TIMEOUT;
#if defined (QABSTRACTSOCKET_DEBUG) #if defined (QABSTRACTSOCKET_DEBUG)
@ -2146,7 +2132,7 @@ bool QAbstractSocket::waitForReadyRead(int msecs)
bool readyToRead = false; bool readyToRead = false;
bool readyToWrite = false; bool readyToWrite = false;
if (!d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, true, !d->writeBuffer.isEmpty(), if (!d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, true, !d->writeBuffer.isEmpty(),
qt_timeout_value(msecs, stopWatch.elapsed()))) { qt_subtract_from_timeout(msecs, stopWatch.elapsed()))) {
d->socketError = d->socketEngine->error(); d->socketError = d->socketEngine->error();
setErrorString(d->socketEngine->errorString()); setErrorString(d->socketEngine->errorString());
#if defined (QABSTRACTSOCKET_DEBUG) #if defined (QABSTRACTSOCKET_DEBUG)
@ -2169,7 +2155,7 @@ bool QAbstractSocket::waitForReadyRead(int msecs)
if (state() != ConnectedState) if (state() != ConnectedState)
return false; return false;
} while (msecs == -1 || qt_timeout_value(msecs, stopWatch.elapsed()) > 0); } while (msecs == -1 || qt_subtract_from_timeout(msecs, stopWatch.elapsed()) > 0);
return false; return false;
} }
@ -2218,7 +2204,7 @@ bool QAbstractSocket::waitForBytesWritten(int msecs)
bool readyToRead = false; bool readyToRead = false;
bool readyToWrite = false; bool readyToWrite = false;
if (!d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, true, !d->writeBuffer.isEmpty(), if (!d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, true, !d->writeBuffer.isEmpty(),
qt_timeout_value(msecs, stopWatch.elapsed()))) { qt_subtract_from_timeout(msecs, stopWatch.elapsed()))) {
d->socketError = d->socketEngine->error(); d->socketError = d->socketEngine->error();
setErrorString(d->socketEngine->errorString()); setErrorString(d->socketEngine->errorString());
#if defined (QABSTRACTSOCKET_DEBUG) #if defined (QABSTRACTSOCKET_DEBUG)
@ -2300,7 +2286,7 @@ bool QAbstractSocket::waitForDisconnected(int msecs)
bool readyToWrite = false; bool readyToWrite = false;
if (!d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, state() == ConnectedState, if (!d->socketEngine->waitForReadOrWrite(&readyToRead, &readyToWrite, state() == ConnectedState,
!d->writeBuffer.isEmpty(), !d->writeBuffer.isEmpty(),
qt_timeout_value(msecs, stopWatch.elapsed()))) { qt_subtract_from_timeout(msecs, stopWatch.elapsed()))) {
d->socketError = d->socketEngine->error(); d->socketError = d->socketEngine->error();
setErrorString(d->socketEngine->errorString()); setErrorString(d->socketEngine->errorString());
#if defined (QABSTRACTSOCKET_DEBUG) #if defined (QABSTRACTSOCKET_DEBUG)

View File

@ -36,6 +36,7 @@
#include "qhostaddress.h" #include "qhostaddress.h"
#include "qurl.h" #include "qurl.h"
#include "private/qhttpnetworkreply_p.h" #include "private/qhttpnetworkreply_p.h"
#include "private/qiodevice_p.h"
#include "qelapsedtimer.h" #include "qelapsedtimer.h"
#include "qnetworkinterface.h" #include "qnetworkinterface.h"
@ -330,19 +331,6 @@ bool QHttpSocketEngine::setOption(SocketOption option, int value)
return false; return false;
} }
/*
Returns the difference between msecs and elapsed. If msecs is -1,
however, -1 is returned.
*/
static int qt_timeout_value(int msecs, int elapsed)
{
if (msecs == -1)
return -1;
int timeout = msecs - elapsed;
return timeout < 0 ? 0 : timeout;
}
bool QHttpSocketEngine::waitForRead(int msecs, bool *timedOut) bool QHttpSocketEngine::waitForRead(int msecs, bool *timedOut)
{ {
Q_D(const QHttpSocketEngine); Q_D(const QHttpSocketEngine);
@ -355,7 +343,7 @@ bool QHttpSocketEngine::waitForRead(int msecs, bool *timedOut)
// Wait for more data if nothing is available. // Wait for more data if nothing is available.
if (!d->socket->bytesAvailable()) { if (!d->socket->bytesAvailable()) {
if (!d->socket->waitForReadyRead(qt_timeout_value(msecs, stopWatch.elapsed()))) { if (!d->socket->waitForReadyRead(qt_subtract_from_timeout(msecs, stopWatch.elapsed()))) {
if (d->socket->state() == QAbstractSocket::UnconnectedState) if (d->socket->state() == QAbstractSocket::UnconnectedState)
return true; return true;
setError(d->socket->error(), d->socket->errorString()); setError(d->socket->error(), d->socket->errorString());
@ -367,7 +355,7 @@ bool QHttpSocketEngine::waitForRead(int msecs, bool *timedOut)
// If we're not connected yet, wait until we are, or until an error // If we're not connected yet, wait until we are, or until an error
// occurs. // occurs.
while (d->state != Connected && d->socket->waitForReadyRead(qt_timeout_value(msecs, stopWatch.elapsed()))) { while (d->state != Connected && d->socket->waitForReadyRead(qt_subtract_from_timeout(msecs, stopWatch.elapsed()))) {
// Loop while the protocol handshake is taking place. // Loop while the protocol handshake is taking place.
} }
@ -403,7 +391,7 @@ bool QHttpSocketEngine::waitForWrite(int msecs, bool *timedOut)
// If we're not connected yet, wait until we are, and until bytes have // If we're not connected yet, wait until we are, and until bytes have
// been received (i.e., the socket has connected, we have sent the // been received (i.e., the socket has connected, we have sent the
// greeting, and then received the response). // greeting, and then received the response).
while (d->state != Connected && d->socket->waitForReadyRead(qt_timeout_value(msecs, stopWatch.elapsed()))) { while (d->state != Connected && d->socket->waitForReadyRead(qt_subtract_from_timeout(msecs, stopWatch.elapsed()))) {
// Loop while the protocol handshake is taking place. // Loop while the protocol handshake is taking place.
} }

View File

@ -47,6 +47,7 @@
#include "qcoreapplication.h" #include "qcoreapplication.h"
#include "qurl.h" #include "qurl.h"
#include "qauthenticator.h" #include "qauthenticator.h"
#include "private/qiodevice_p.h"
#include <qendian.h> #include <qendian.h>
#include <qnetworkinterface.h> #include <qnetworkinterface.h>
@ -269,19 +270,6 @@ static int qt_socks5_get_host_address_and_port(const QByteArray &buf, QHostAddre
return ret; return ret;
} }
/*
Returns the difference between msecs and elapsed. If msecs is -1,
however, -1 is returned.
*/
static int qt_timeout_value(int msecs, int elapsed)
{
if (msecs == -1)
return -1;
int timeout = msecs - elapsed;
return timeout < 0 ? 0 : timeout;
}
struct QSocks5Data struct QSocks5Data
{ {
QTcpSocket *controlSocket; QTcpSocket *controlSocket;
@ -1396,7 +1384,7 @@ bool QSocks5SocketEngine::bind(const QHostAddress &addr, quint16 port)
dummy.setProxy(QNetworkProxy::NoProxy); dummy.setProxy(QNetworkProxy::NoProxy);
if (!dummy.bind() if (!dummy.bind()
|| writeDatagram(0,0, d->data->controlSocket->localAddress(), dummy.localPort()) != 0 || writeDatagram(0,0, d->data->controlSocket->localAddress(), dummy.localPort()) != 0
|| !dummy.waitForReadyRead(qt_timeout_value(msecs, stopWatch.elapsed())) || !dummy.waitForReadyRead(qt_subtract_from_timeout(msecs, stopWatch.elapsed()))
|| dummy.readDatagram(0,0, &d->localAddress, &d->localPort) != 0) { || dummy.readDatagram(0,0, &d->localAddress, &d->localPort) != 0) {
QSOCKS5_DEBUG << "udp actual address and port lookup failed"; QSOCKS5_DEBUG << "udp actual address and port lookup failed";
setState(QAbstractSocket::UnconnectedState); setState(QAbstractSocket::UnconnectedState);
@ -1484,7 +1472,7 @@ void QSocks5SocketEngine::close()
QElapsedTimer stopWatch; QElapsedTimer stopWatch;
stopWatch.start(); stopWatch.start();
while (!d->data->controlSocket->bytesToWrite()) { while (!d->data->controlSocket->bytesToWrite()) {
if (!d->data->controlSocket->waitForBytesWritten(qt_timeout_value(msecs, stopWatch.elapsed()))) if (!d->data->controlSocket->waitForBytesWritten(qt_subtract_from_timeout(msecs, stopWatch.elapsed())))
break; break;
} }
} }
@ -1740,7 +1728,7 @@ bool QSocks5SocketEnginePrivate::waitForConnected(int msecs, bool *timedOut)
stopWatch.start(); stopWatch.start();
while (socks5State != wantedState) { while (socks5State != wantedState) {
if (!data->controlSocket->waitForReadyRead(qt_timeout_value(msecs, stopWatch.elapsed()))) { if (!data->controlSocket->waitForReadyRead(qt_subtract_from_timeout(msecs, stopWatch.elapsed()))) {
if (data->controlSocket->state() == QAbstractSocket::UnconnectedState) if (data->controlSocket->state() == QAbstractSocket::UnconnectedState)
return true; return true;
@ -1774,7 +1762,7 @@ bool QSocks5SocketEngine::waitForRead(int msecs, bool *timedOut)
if (d->mode == QSocks5SocketEnginePrivate::ConnectMode || if (d->mode == QSocks5SocketEnginePrivate::ConnectMode ||
d->mode == QSocks5SocketEnginePrivate::BindMode) { d->mode == QSocks5SocketEnginePrivate::BindMode) {
while (!d->readNotificationActivated) { while (!d->readNotificationActivated) {
if (!d->data->controlSocket->waitForReadyRead(qt_timeout_value(msecs, stopWatch.elapsed()))) { if (!d->data->controlSocket->waitForReadyRead(qt_subtract_from_timeout(msecs, stopWatch.elapsed()))) {
if (d->data->controlSocket->state() == QAbstractSocket::UnconnectedState) if (d->data->controlSocket->state() == QAbstractSocket::UnconnectedState)
return true; return true;
@ -1787,7 +1775,7 @@ bool QSocks5SocketEngine::waitForRead(int msecs, bool *timedOut)
#ifndef QT_NO_UDPSOCKET #ifndef QT_NO_UDPSOCKET
} else { } else {
while (!d->readNotificationActivated) { while (!d->readNotificationActivated) {
if (!d->udpData->udpSocket->waitForReadyRead(qt_timeout_value(msecs, stopWatch.elapsed()))) { if (!d->udpData->udpSocket->waitForReadyRead(qt_subtract_from_timeout(msecs, stopWatch.elapsed()))) {
setError(d->udpData->udpSocket->error(), d->udpData->udpSocket->errorString()); setError(d->udpData->udpSocket->error(), d->udpData->udpSocket->errorString());
if (timedOut && d->udpData->udpSocket->error() == QAbstractSocket::SocketTimeoutError) if (timedOut && d->udpData->udpSocket->error() == QAbstractSocket::SocketTimeoutError)
*timedOut = true; *timedOut = true;
@ -1824,11 +1812,11 @@ bool QSocks5SocketEngine::waitForWrite(int msecs, bool *timedOut)
// flush any bytes we may still have buffered in the time that we have left // flush any bytes we may still have buffered in the time that we have left
if (d->data->controlSocket->bytesToWrite()) if (d->data->controlSocket->bytesToWrite())
d->data->controlSocket->waitForBytesWritten(qt_timeout_value(msecs, stopWatch.elapsed())); d->data->controlSocket->waitForBytesWritten(qt_subtract_from_timeout(msecs, stopWatch.elapsed()));
while ((msecs == -1 || stopWatch.elapsed() < msecs) while ((msecs == -1 || stopWatch.elapsed() < msecs)
&& d->data->controlSocket->state() == QAbstractSocket::ConnectedState && d->data->controlSocket->state() == QAbstractSocket::ConnectedState
&& d->data->controlSocket->bytesToWrite() >= MaxWriteBufferSize) && d->data->controlSocket->bytesToWrite() >= MaxWriteBufferSize)
d->data->controlSocket->waitForBytesWritten(qt_timeout_value(msecs, stopWatch.elapsed())); d->data->controlSocket->waitForBytesWritten(qt_subtract_from_timeout(msecs, stopWatch.elapsed()));
return d->data->controlSocket->bytesToWrite() < MaxWriteBufferSize; return d->data->controlSocket->bytesToWrite() < MaxWriteBufferSize;
} }

View File

@ -301,19 +301,6 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
/*
Returns the difference between msecs and elapsed. If msecs is -1,
however, -1 is returned.
*/
static int qt_timeout_value(int msecs, int elapsed)
{
if (msecs == -1)
return -1;
int timeout = msecs - elapsed;
return timeout < 0 ? 0 : timeout;
}
class QSslSocketGlobalData class QSslSocketGlobalData
{ {
public: public:
@ -1518,7 +1505,7 @@ bool QSslSocket::waitForEncrypted(int msecs)
startClientEncryption(); startClientEncryption();
// Loop, waiting until the connection has been encrypted or an error // Loop, waiting until the connection has been encrypted or an error
// occurs. // occurs.
if (!d->plainSocket->waitForReadyRead(qt_timeout_value(msecs, stopWatch.elapsed()))) if (!d->plainSocket->waitForReadyRead(qt_subtract_from_timeout(msecs, stopWatch.elapsed())))
return false; return false;
} }
return d->connectionEncrypted; return d->connectionEncrypted;
@ -1562,7 +1549,7 @@ bool QSslSocket::waitForReadyRead(int msecs)
// test readyReadEmitted first because either operation above // test readyReadEmitted first because either operation above
// (waitForEncrypted or transmit) may have set it // (waitForEncrypted or transmit) may have set it
while (!readyReadEmitted && while (!readyReadEmitted &&
d->plainSocket->waitForReadyRead(qt_timeout_value(msecs, stopWatch.elapsed()))) { d->plainSocket->waitForReadyRead(qt_subtract_from_timeout(msecs, stopWatch.elapsed()))) {
} }
d->readyReadEmittedPointer = previousReadyReadEmittedPointer; d->readyReadEmittedPointer = previousReadyReadEmittedPointer;
@ -1593,7 +1580,7 @@ bool QSslSocket::waitForBytesWritten(int msecs)
d->transmit(); d->transmit();
} }
return d->plainSocket->waitForBytesWritten(qt_timeout_value(msecs, stopWatch.elapsed())); return d->plainSocket->waitForBytesWritten(qt_subtract_from_timeout(msecs, stopWatch.elapsed()));
} }
/*! /*!
@ -1626,7 +1613,7 @@ bool QSslSocket::waitForDisconnected(int msecs)
if (!waitForEncrypted(msecs)) if (!waitForEncrypted(msecs))
return false; return false;
} }
bool retVal = d->plainSocket->waitForDisconnected(qt_timeout_value(msecs, stopWatch.elapsed())); bool retVal = d->plainSocket->waitForDisconnected(qt_subtract_from_timeout(msecs, stopWatch.elapsed()));
if (!retVal) { if (!retVal) {
setSocketState(d->plainSocket->state()); setSocketState(d->plainSocket->state());
setSocketError(d->plainSocket->error()); setSocketError(d->plainSocket->error());

View File

@ -2,7 +2,7 @@ CONFIG += testcase
TARGET = tst_networkselftest TARGET = tst_networkselftest
SOURCES += tst_networkselftest.cpp SOURCES += tst_networkselftest.cpp
QT = core network testlib QT = core core-private network testlib
win32:CONFIG += insignificant_test # QTBUG-27571 win32:CONFIG += insignificant_test # QTBUG-27571
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0

View File

@ -34,6 +34,7 @@
#include <QtTest/QtTest> #include <QtTest/QtTest>
#include <QtNetwork/QtNetwork> #include <QtNetwork/QtNetwork>
#include <QtCore/QDateTime> #include <QtCore/QDateTime>
#include <QtCore/private/qiodevice_p.h>
#ifndef QT_NO_BEARERMANAGEMENT #ifndef QT_NO_BEARERMANAGEMENT
#include <QtNetwork/qnetworkconfigmanager.h> #include <QtNetwork/qnetworkconfigmanager.h>
@ -171,10 +172,11 @@ static bool doSocketRead(QTcpSocket *socket, int minBytesAvailable, int timeout
forever { forever {
if (socket->bytesAvailable() >= minBytesAvailable) if (socket->bytesAvailable() >= minBytesAvailable)
return true; return true;
timeout = qt_subtract_from_timeout(timeout, timer.elapsed());
if (socket->state() == QAbstractSocket::UnconnectedState if (socket->state() == QAbstractSocket::UnconnectedState
|| timer.elapsed() >= timeout) || timeout == 0)
return false; return false;
if (!socket->waitForReadyRead(timeout - timer.elapsed())) if (!socket->waitForReadyRead(timeout))
return false; return false;
} }
} }
@ -202,10 +204,11 @@ static bool doSocketFlush(QTcpSocket *socket, int timeout = 4000)
#endif #endif
) )
return true; return true;
timeout = qt_subtract_from_timeout(timeout, timer.elapsed());
if (socket->state() == QAbstractSocket::UnconnectedState if (socket->state() == QAbstractSocket::UnconnectedState
|| timer.elapsed() >= timeout) || timeout == 0)
return false; return false;
if (!socket->waitForBytesWritten(timeout - timer.elapsed())) if (!socket->waitForBytesWritten(timeout))
return false; return false;
} }
} }