summaryrefslogtreecommitdiffstats
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
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>
-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;