From 25c0fdc885c675c0253adc4d8a7b528ad88e49e3 Mon Sep 17 00:00:00 2001 From: Alex Trotsenko Date: Sun, 6 Sep 2015 12:16:08 +0300 Subject: 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 --- src/network/socket/qabstractsocket.cpp | 28 ++++++++++++++++++++-------- src/network/socket/qabstractsocket_p.h | 1 + 2 files changed, 21 insertions(+), 8 deletions(-) (limited to 'src/network/socket') 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 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(); } } @@ -1305,6 +1302,21 @@ bool QAbstractSocketPrivate::readFromSocket() return true; } +/*! \internal + + Prevents from the recursive readyRead() emission. +*/ +void QAbstractSocketPrivate::emitReadyRead() +{ + Q_Q(QAbstractSocket); + // Only emit readyRead() when not recursing. + if (!emittedReadyRead) { + QScopedValueRollback r(emittedReadyRead); + emittedReadyRead = true; + emit q->readyRead(); + } +} + /*! \internal Sets up the internal state after the connection has succeeded. 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; -- cgit v1.2.3