summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMÃ¥rten Nordheim <marten.nordheim@qt.io>2020-05-05 14:27:57 +0200
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2020-05-18 11:59:40 +0000
commit34010e649734fe7a41d1a0280c606b15de5c2799 (patch)
tree8703a7d4b0803963c6cccb9434884cc7e4985763
parent432176cc8f377046e2216ade3fb4c43d27ec8938 (diff)
downloadqtwebsockets-34010e649734fe7a41d1a0280c606b15de5c2799.tar.gz
Make sure child QObjects get moved-to-thread along with the owner
By parenting them. And to do that without crashing they need to be allocated dynamically. A couple missed "parenting"s caused the object to not be moved to the other thread when the websocket was moved. This caused it to print warnings when the timer was started and stopped since this cannot be done across threads. Fixes: QTBUG-83722 Change-Id: Iee60fe1c498f8f6d1e0c2cfcb2923bd5b9560acb Reviewed-by: Jesus Fernandez <jsfdez@gmail.com> (cherry picked from commit 393fcf8a64748f0c59f47d254667518dba9e2fc3) Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
-rw-r--r--src/websockets/qwebsocket_p.cpp33
-rw-r--r--src/websockets/qwebsocket_p.h2
-rw-r--r--src/websockets/qwebsocketdataprocessor.cpp13
-rw-r--r--src/websockets/qwebsocketdataprocessor_p.h2
4 files changed, 25 insertions, 25 deletions
diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp
index 659e283..5a95215 100644
--- a/src/websockets/qwebsocket_p.cpp
+++ b/src/websockets/qwebsocket_p.cpp
@@ -108,7 +108,6 @@ QWebSocketPrivate::QWebSocketPrivate(const QString &origin, QWebSocketProtocol::
m_closeCode(QWebSocketProtocol::CloseCodeNormal),
m_closeReason(),
m_pingTimer(),
- m_dataProcessor(),
m_configuration(),
m_pMaskGenerator(&m_defaultMaskGenerator),
m_defaultMaskGenerator(),
@@ -141,7 +140,6 @@ QWebSocketPrivate::QWebSocketPrivate(QTcpSocket *pTcpSocket, QWebSocketProtocol:
m_closeCode(QWebSocketProtocol::CloseCodeNormal),
m_closeReason(),
m_pingTimer(),
- m_dataProcessor(),
m_configuration(),
m_pMaskGenerator(&m_defaultMaskGenerator),
m_defaultMaskGenerator(),
@@ -159,6 +157,7 @@ void QWebSocketPrivate::init()
Q_ASSERT(q_ptr);
Q_ASSERT(m_pMaskGenerator);
+ m_dataProcessor->setParent(q_ptr);
m_pMaskGenerator->seed();
if (m_pSocket) {
@@ -391,7 +390,7 @@ void QWebSocketPrivate::open(const QNetworkRequest &request, bool mask)
}
//if (m_url != url)
if (Q_LIKELY(!m_pSocket)) {
- m_dataProcessor.clear();
+ m_dataProcessor->clear();
m_isClosingHandshakeReceived = false;
m_isClosingHandshakeSent = false;
@@ -622,21 +621,21 @@ void QWebSocketPrivate::makeConnections(QTcpSocket *pTcpSocket)
}
}
- QObject::connect(&m_dataProcessor, &QWebSocketDataProcessor::textFrameReceived, q,
+ QObject::connect(m_dataProcessor, &QWebSocketDataProcessor::textFrameReceived, q,
&QWebSocket::textFrameReceived);
- QObject::connect(&m_dataProcessor, &QWebSocketDataProcessor::binaryFrameReceived, q,
+ QObject::connect(m_dataProcessor, &QWebSocketDataProcessor::binaryFrameReceived, q,
&QWebSocket::binaryFrameReceived);
- QObject::connect(&m_dataProcessor, &QWebSocketDataProcessor::binaryMessageReceived, q,
+ QObject::connect(m_dataProcessor, &QWebSocketDataProcessor::binaryMessageReceived, q,
&QWebSocket::binaryMessageReceived);
- QObject::connect(&m_dataProcessor, &QWebSocketDataProcessor::textMessageReceived, q,
+ QObject::connect(m_dataProcessor, &QWebSocketDataProcessor::textMessageReceived, q,
&QWebSocket::textMessageReceived);
- QObjectPrivate::connect(&m_dataProcessor, &QWebSocketDataProcessor::errorEncountered, this,
+ QObjectPrivate::connect(m_dataProcessor, &QWebSocketDataProcessor::errorEncountered, this,
&QWebSocketPrivate::close);
- QObjectPrivate::connect(&m_dataProcessor, &QWebSocketDataProcessor::pingReceived, this,
+ QObjectPrivate::connect(m_dataProcessor, &QWebSocketDataProcessor::pingReceived, this,
&QWebSocketPrivate::processPing);
- QObjectPrivate::connect(&m_dataProcessor, &QWebSocketDataProcessor::pongReceived, this,
+ QObjectPrivate::connect(m_dataProcessor, &QWebSocketDataProcessor::pongReceived, this,
&QWebSocketPrivate::processPong);
- QObjectPrivate::connect(&m_dataProcessor, &QWebSocketDataProcessor::closeReceived, this,
+ QObjectPrivate::connect(m_dataProcessor, &QWebSocketDataProcessor::closeReceived, this,
&QWebSocketPrivate::processClose);
//fire readyread, in case we already have data inside the tcpSocket
@@ -651,7 +650,7 @@ void QWebSocketPrivate::releaseConnections(const QTcpSocket *pTcpSocket)
{
if (Q_LIKELY(pTcpSocket))
pTcpSocket->disconnect();
- m_dataProcessor.disconnect();
+ m_dataProcessor->disconnect();
}
/*!
@@ -1181,7 +1180,7 @@ void QWebSocketPrivate::processData()
if (!m_pSocket->canReadLine())
return;
processHandshake(m_pSocket);
- } else if (!m_dataProcessor.process(m_pSocket)) {
+ } else if (!m_dataProcessor->process(m_pSocket)) {
return;
}
}
@@ -1311,7 +1310,7 @@ void QWebSocketPrivate::setSocketState(QAbstractSocket::SocketState state)
*/
void QWebSocketPrivate::setMaxAllowedIncomingFrameSize(quint64 maxAllowedIncomingFrameSize)
{
- m_dataProcessor.setMaxAllowedFrameSize(maxAllowedIncomingFrameSize);
+ m_dataProcessor->setMaxAllowedFrameSize(maxAllowedIncomingFrameSize);
}
/*!
@@ -1319,7 +1318,7 @@ void QWebSocketPrivate::setMaxAllowedIncomingFrameSize(quint64 maxAllowedIncomin
*/
quint64 QWebSocketPrivate::maxAllowedIncomingFrameSize() const
{
- return m_dataProcessor.maxAllowedFrameSize();
+ return m_dataProcessor->maxAllowedFrameSize();
}
/*!
@@ -1327,7 +1326,7 @@ quint64 QWebSocketPrivate::maxAllowedIncomingFrameSize() const
*/
void QWebSocketPrivate::setMaxAllowedIncomingMessageSize(quint64 maxAllowedIncomingMessageSize)
{
- m_dataProcessor.setMaxAllowedMessageSize(maxAllowedIncomingMessageSize);
+ m_dataProcessor->setMaxAllowedMessageSize(maxAllowedIncomingMessageSize);
}
/*!
@@ -1335,7 +1334,7 @@ void QWebSocketPrivate::setMaxAllowedIncomingMessageSize(quint64 maxAllowedIncom
*/
quint64 QWebSocketPrivate::maxAllowedIncomingMessageSize() const
{
- return m_dataProcessor.maxAllowedMessageSize();
+ return m_dataProcessor->maxAllowedMessageSize();
}
/*!
diff --git a/src/websockets/qwebsocket_p.h b/src/websockets/qwebsocket_p.h
index 640e7b2..ad667aa 100644
--- a/src/websockets/qwebsocket_p.h
+++ b/src/websockets/qwebsocket_p.h
@@ -242,7 +242,7 @@ private:
QElapsedTimer m_pingTimer;
- QWebSocketDataProcessor m_dataProcessor;
+ QWebSocketDataProcessor *m_dataProcessor = new QWebSocketDataProcessor();
QWebSocketConfiguration m_configuration;
QMaskGenerator *m_pMaskGenerator;
diff --git a/src/websockets/qwebsocketdataprocessor.cpp b/src/websockets/qwebsocketdataprocessor.cpp
index 4110f2a..0d2e927 100644
--- a/src/websockets/qwebsocketdataprocessor.cpp
+++ b/src/websockets/qwebsocketdataprocessor.cpp
@@ -84,13 +84,14 @@ QWebSocketDataProcessor::QWebSocketDataProcessor(QObject *parent) :
m_textMessage(),
m_payloadLength(0),
m_pConverterState(nullptr),
- m_pTextCodec(QTextCodec::codecForName("UTF-8"))
+ m_pTextCodec(QTextCodec::codecForName("UTF-8")),
+ m_waitTimer(new QTimer(this))
{
clear();
// initialize the internal timeout timer
- waitTimer.setInterval(5000);
- waitTimer.setSingleShot(true);
- waitTimer.callOnTimeout(this, &QWebSocketDataProcessor::timeout);
+ m_waitTimer->setInterval(5000);
+ m_waitTimer->setSingleShot(true);
+ m_waitTimer->callOnTimeout(this, &QWebSocketDataProcessor::timeout);
}
/*!
@@ -163,8 +164,8 @@ bool QWebSocketDataProcessor::process(QIODevice *pIoDevice)
if (!frame.isDone()) {
// waiting for more data available
QObject::connect(pIoDevice, &QIODevice::readyRead,
- &waitTimer, &QTimer::stop, Qt::UniqueConnection);
- waitTimer.start();
+ m_waitTimer, &QTimer::stop, Qt::UniqueConnection);
+ m_waitTimer->start();
return false;
} else if (Q_LIKELY(frame.isValid())) {
if (frame.isControlFrame()) {
diff --git a/src/websockets/qwebsocketdataprocessor_p.h b/src/websockets/qwebsocketdataprocessor_p.h
index 62a2dc0..d540089 100644
--- a/src/websockets/qwebsocketdataprocessor_p.h
+++ b/src/websockets/qwebsocketdataprocessor_p.h
@@ -120,7 +120,7 @@ private:
QTextCodec::ConverterState *m_pConverterState;
QTextCodec *m_pTextCodec;
QWebSocketFrame frame;
- QTimer waitTimer;
+ QTimer *m_waitTimer;
quint64 m_maxAllowedMessageSize = MAX_MESSAGE_SIZE_IN_BYTES;
bool processControlFrame(const QWebSocketFrame &frame);