diff options
author | Harald Meyer <dev@meh.at> | 2016-01-01 12:19:07 +0100 |
---|---|---|
committer | Oliver Wolff <oliver.wolff@qt.io> | 2016-10-12 09:03:02 +0000 |
commit | 05fd7f8d902eb736f3f5f96b2f5b3af1fe54c439 (patch) | |
tree | b5f31a5a8f74e541243d0321b98fdc5a7234a728 /src/network | |
parent | 19cbe171c22b839856ea4dcdac7a87380cdc2533 (diff) |
winrt: tcpsocket: Update bytesAvailable when new data is read
Instead of calculating the bytesAvailable in place, the value should
be stored and only retrieved in the function itself. Otherwise it is
possible that bytesAvailable is called between the data having been
read and readyRead is emitted. In this case it's possible, that the
client reads all the data before the signal is emitted. Triggering
readyRead without any data being available will stop the socket.
Task-number: QTBUG-44357
Change-Id: I81d6ab094c5fdd71f30b9ceba9d790153cc92439
Reviewed-by: Harald Meyer <dev@meh.at>
Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/socket/qnativesocketengine_winrt.cpp | 7 | ||||
-rw-r--r-- | src/network/socket/qnativesocketengine_winrt_p.h | 2 |
2 files changed, 7 insertions, 2 deletions
diff --git a/src/network/socket/qnativesocketengine_winrt.cpp b/src/network/socket/qnativesocketengine_winrt.cpp index 69ebfdfceb..bd9b443602 100644 --- a/src/network/socket/qnativesocketengine_winrt.cpp +++ b/src/network/socket/qnativesocketengine_winrt.cpp @@ -643,7 +643,7 @@ qint64 QNativeSocketEngine::bytesAvailable() const if (d->socketType != QAbstractSocket::TcpSocket) return -1; - return d->readBytes.size() - d->readBytes.pos(); + return d->bytesAvailable; } qint64 QNativeSocketEngine::read(char *data, qint64 maxlen) @@ -661,7 +661,9 @@ qint64 QNativeSocketEngine::read(char *data, qint64 maxlen) } QMutexLocker mutexLocker(&d->readMutex); - return d->readBytes.read(data, maxlen); + qint64 b = d->readBytes.read(data, maxlen); + d->bytesAvailable = d->readBytes.size() - d->readBytes.pos(); + return b; } qint64 QNativeSocketEngine::write(const char *data, qint64 len) @@ -1456,6 +1458,7 @@ HRESULT QNativeSocketEnginePrivate::handleReadyRead(IAsyncBufferOperation *async Q_ASSERT(readBytes.atEnd()); readBytes.write(reinterpret_cast<const char*>(data), qint64(bufferLength)); readBytes.seek(readPos); + bytesAvailable = readBytes.size() - readBytes.pos(); readMutex.unlock(); if (notifyOnRead) diff --git a/src/network/socket/qnativesocketengine_winrt_p.h b/src/network/socket/qnativesocketengine_winrt_p.h index 6bc77c1529..605f3631b9 100644 --- a/src/network/socket/qnativesocketengine_winrt_p.h +++ b/src/network/socket/qnativesocketengine_winrt_p.h @@ -55,6 +55,7 @@ #include <QtCore/QEventLoop> #include <QtCore/QBuffer> #include <QtCore/QMutex> +#include <QtCore/QAtomicInteger> #include "QtNetwork/qhostaddress.h" #include "private/qabstractsocketengine_p.h" #include <wrl.h> @@ -217,6 +218,7 @@ private: QBuffer readBytes; QMutex readMutex; bool emitOnNewDatagram; + QAtomicInteger<int> bytesAvailable; QList<WinRtDatagram> pendingDatagrams; QList<ABI::Windows::Networking::Sockets::IStreamSocket *> pendingConnections; |