summaryrefslogtreecommitdiffstats
path: root/src/network
diff options
context:
space:
mode:
authorHarald Meyer <dev@meh.at>2016-01-01 12:19:07 +0100
committerOliver Wolff <oliver.wolff@qt.io>2016-10-12 09:03:02 +0000
commit05fd7f8d902eb736f3f5f96b2f5b3af1fe54c439 (patch)
treeb5f31a5a8f74e541243d0321b98fdc5a7234a728 /src/network
parent19cbe171c22b839856ea4dcdac7a87380cdc2533 (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.cpp7
-rw-r--r--src/network/socket/qnativesocketengine_winrt_p.h2
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;