summaryrefslogtreecommitdiffstats
path: root/src/network
diff options
context:
space:
mode:
authorAlex Trotsenko <alex1973tr@gmail.com>2015-09-06 12:16:08 +0300
committerAlex Trotsenko <alex1973tr@gmail.com>2015-09-09 14:58:37 +0000
commit25c0fdc885c675c0253adc4d8a7b528ad88e49e3 (patch)
treecf1b6d8b715418634a1195f367484e6edd3f3153 /src/network
parent14960f52276d82600913b52b0ebbf4d5372debe2 (diff)
Do not emit readyRead() recursively on close notification
QAbstractSocket already prevents from the recursive readyRead() emission in canReadNotification(). Follow this behavior in case the socket receives a close notification. Change-Id: Ifd916d60252832c19e0dcdeaa8dde8af75b45cf7 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/network')
-rw-r--r--src/network/socket/qabstractsocket.cpp28
-rw-r--r--src/network/socket/qabstractsocket_p.h1
2 files changed, 21 insertions, 8 deletions
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp
index 1119cc57df..b5aea6f5e5 100644
--- a/src/network/socket/qabstractsocket.cpp
+++ b/src/network/socket/qabstractsocket.cpp
@@ -723,7 +723,7 @@ bool QAbstractSocketPrivate::canReadNotification()
}
}
- // only emit readyRead() when not recursing, and only if there is data available
+ // Only emit readyRead() if there is data available.
bool hasData = newBytes > 0
#ifndef QT_NO_UDPSOCKET
|| (!isBuffered && socketType != QAbstractSocket::TcpSocket && socketEngine && socketEngine->hasPendingDatagrams())
@@ -731,11 +731,8 @@ bool QAbstractSocketPrivate::canReadNotification()
|| (!isBuffered && socketType == QAbstractSocket::TcpSocket && socketEngine)
;
- if (!emittedReadyRead && hasData) {
- QScopedValueRollback<bool> r(emittedReadyRead);
- emittedReadyRead = true;
- emit q->readyRead();
- }
+ if (hasData)
+ emitReadyRead();
// If we were closed as a result of the readyRead() signal,
// return.
@@ -794,12 +791,12 @@ void QAbstractSocketPrivate::canCloseNotification()
// then occur when we read from the socket again and fail
// in canReadNotification or by the manually created
// closeNotification below.
- emit q->readyRead();
+ emitReadyRead();
QMetaObject::invokeMethod(socketEngine, "closeNotification", Qt::QueuedConnection);
}
} else if (socketType == QAbstractSocket::TcpSocket && socketEngine) {
- emit q->readyRead();
+ emitReadyRead();
}
}
@@ -1307,6 +1304,21 @@ bool QAbstractSocketPrivate::readFromSocket()
/*! \internal
+ Prevents from the recursive readyRead() emission.
+*/
+void QAbstractSocketPrivate::emitReadyRead()
+{
+ Q_Q(QAbstractSocket);
+ // Only emit readyRead() when not recursing.
+ if (!emittedReadyRead) {
+ QScopedValueRollback<bool> r(emittedReadyRead);
+ emittedReadyRead = true;
+ emit q->readyRead();
+ }
+}
+
+/*! \internal
+
Sets up the internal state after the connection has succeeded.
*/
void QAbstractSocketPrivate::fetchConnectionParameters()
diff --git a/src/network/socket/qabstractsocket_p.h b/src/network/socket/qabstractsocket_p.h
index 85e82aef47..93724ae29e 100644
--- a/src/network/socket/qabstractsocket_p.h
+++ b/src/network/socket/qabstractsocket_p.h
@@ -135,6 +135,7 @@ public:
void fetchConnectionParameters();
void setupSocketNotifiers();
bool readFromSocket();
+ void emitReadyRead();
qint64 readBufferMaxSize;
QRingBuffer writeBuffer;