From db757e9e7bf5a1a2a2363ac1a2e01130a2e14093 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 25 Mar 2014 17:18:45 -0700 Subject: [PATCH 1/6] increase NodeList send buffer size by default to 128KB --- libraries/shared/src/NodeList.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index e80f25709a..e26e6be547 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -83,6 +83,17 @@ NodeList::NodeList(char newOwnerType, unsigned short int newSocketListenPort) : // clear our NodeList when logout is requested connect(&AccountManager::getInstance(), &AccountManager::logoutComplete , this, &NodeList::reset); + // change the socket send buffer size to be 128KB + const int LARGER_SNDBUF_SIZE = 131072; + + setsockopt(_nodeSocket.socketDescriptor(), SOL_SOCKET, SO_SNDBUF, &LARGER_SNDBUF_SIZE, sizeof(LARGER_SNDBUF_SIZE)); + + int newBufferSize = 0; + unsigned int sizeOfInt = sizeof(newBufferSize); + getsockopt(_nodeSocket.socketDescriptor(), SOL_SOCKET, SO_SNDBUF, &newBufferSize, &sizeOfInt); + + qDebug() << "Changed socket send buffer size to" << newBufferSize << "bytes"; + _packetStatTimer.start(); } From 46077a7fb0c97018409a7fafc2b5a992a29fb934 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 25 Mar 2014 17:24:17 -0700 Subject: [PATCH 2/6] output old size when notifying for send buffer size change --- libraries/shared/src/NodeList.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index e26e6be547..89b0ff2fbc 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -84,15 +84,18 @@ NodeList::NodeList(char newOwnerType, unsigned short int newSocketListenPort) : connect(&AccountManager::getInstance(), &AccountManager::logoutComplete , this, &NodeList::reset); // change the socket send buffer size to be 128KB + int oldBufferSize = 0; + unsigned int sizeOfInt = sizeof(oldBufferSize); + getsockopt(_nodeSocket.socketDescriptor(), SOL_SOCKET, SO_SNDBUF, &oldBufferSize, &sizeOfInt); + const int LARGER_SNDBUF_SIZE = 131072; setsockopt(_nodeSocket.socketDescriptor(), SOL_SOCKET, SO_SNDBUF, &LARGER_SNDBUF_SIZE, sizeof(LARGER_SNDBUF_SIZE)); int newBufferSize = 0; - unsigned int sizeOfInt = sizeof(newBufferSize); getsockopt(_nodeSocket.socketDescriptor(), SOL_SOCKET, SO_SNDBUF, &newBufferSize, &sizeOfInt); - qDebug() << "Changed socket send buffer size to" << newBufferSize << "bytes"; + qDebug() << "Changed socket send buffer size from" << oldBufferSize << "to" << newBufferSize << "bytes"; _packetStatTimer.start(); } From ed9c805539ecb25c787823a08940ce39a80873b7 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 25 Mar 2014 17:29:35 -0700 Subject: [PATCH 3/6] attempt to set send buffer size to 1MB --- libraries/shared/src/NodeList.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 89b0ff2fbc..d25c3f7e1d 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -83,12 +83,12 @@ NodeList::NodeList(char newOwnerType, unsigned short int newSocketListenPort) : // clear our NodeList when logout is requested connect(&AccountManager::getInstance(), &AccountManager::logoutComplete , this, &NodeList::reset); - // change the socket send buffer size to be 128KB + // change the socket send buffer size to be 1MB int oldBufferSize = 0; unsigned int sizeOfInt = sizeof(oldBufferSize); getsockopt(_nodeSocket.socketDescriptor(), SOL_SOCKET, SO_SNDBUF, &oldBufferSize, &sizeOfInt); - const int LARGER_SNDBUF_SIZE = 131072; + const int LARGER_SNDBUF_SIZE = 1048576; setsockopt(_nodeSocket.socketDescriptor(), SOL_SOCKET, SO_SNDBUF, &LARGER_SNDBUF_SIZE, sizeof(LARGER_SNDBUF_SIZE)); From c4b8ff895256e1d4701fb78dac1d66cf85168c69 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 26 Mar 2014 10:53:43 -0700 Subject: [PATCH 4/6] cast setsocktopt and getsockopt calls to fix windows build --- libraries/shared/src/NodeList.cpp | 13 ++++++++----- libraries/shared/src/NodeList.h | 2 ++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index d25c3f7e1d..6b54b8e8ae 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -83,21 +83,24 @@ NodeList::NodeList(char newOwnerType, unsigned short int newSocketListenPort) : // clear our NodeList when logout is requested connect(&AccountManager::getInstance(), &AccountManager::logoutComplete , this, &NodeList::reset); + _packetStatTimer.start(); +} + +void NodeList::changeSendSocketBufferSize(int numSendBytes) { // change the socket send buffer size to be 1MB int oldBufferSize = 0; unsigned int sizeOfInt = sizeof(oldBufferSize); - getsockopt(_nodeSocket.socketDescriptor(), SOL_SOCKET, SO_SNDBUF, &oldBufferSize, &sizeOfInt); + getsockopt(_nodeSocket.socketDescriptor(), SOL_SOCKET, SO_SNDBUF, reinterpret_cast(&oldBufferSize), &sizeOfInt); const int LARGER_SNDBUF_SIZE = 1048576; - setsockopt(_nodeSocket.socketDescriptor(), SOL_SOCKET, SO_SNDBUF, &LARGER_SNDBUF_SIZE, sizeof(LARGER_SNDBUF_SIZE)); + setsockopt(_nodeSocket.socketDescriptor(), SOL_SOCKET, SO_SNDBUF, reinterpret_cast(&LARGER_SNDBUF_SIZE), + sizeof(LARGER_SNDBUF_SIZE)); int newBufferSize = 0; - getsockopt(_nodeSocket.socketDescriptor(), SOL_SOCKET, SO_SNDBUF, &newBufferSize, &sizeOfInt); + getsockopt(_nodeSocket.socketDescriptor(), SOL_SOCKET, SO_SNDBUF, reinterpret_cast(&newBufferSize), &sizeOfInt); qDebug() << "Changed socket send buffer size from" << oldBufferSize << "to" << newBufferSize << "bytes"; - - _packetStatTimer.start(); } bool NodeList::packetVersionAndHashMatch(const QByteArray& packet) { diff --git a/libraries/shared/src/NodeList.h b/libraries/shared/src/NodeList.h index d892223f75..a108fd72c4 100644 --- a/libraries/shared/src/NodeList.h +++ b/libraries/shared/src/NodeList.h @@ -161,6 +161,8 @@ private: void requestAuthForDomainServer(); void activateSocketFromNodeCommunication(const QByteArray& packet, const SharedNodePointer& sendingNode); void timePingReply(const QByteArray& packet, const SharedNodePointer& sendingNode); + + void changeSendSocketBufferSize(int numSendBytes); NodeHash _nodeHash; QMutex _nodeHashMutex; From e03e82a29bbfaed008ae863a2de1db751761acaf Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 26 Mar 2014 11:02:34 -0700 Subject: [PATCH 5/6] ifdef to handle getsockopt format requirements on windows --- libraries/shared/src/NodeList.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 6b54b8e8ae..4690e6ea20 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -89,7 +89,13 @@ NodeList::NodeList(char newOwnerType, unsigned short int newSocketListenPort) : void NodeList::changeSendSocketBufferSize(int numSendBytes) { // change the socket send buffer size to be 1MB int oldBufferSize = 0; + +#ifdef Q_OS_WIN + int sizeOfInt = sizeof(oldBufferSize); +#else unsigned int sizeOfInt = sizeof(oldBufferSize); +#endif + getsockopt(_nodeSocket.socketDescriptor(), SOL_SOCKET, SO_SNDBUF, reinterpret_cast(&oldBufferSize), &sizeOfInt); const int LARGER_SNDBUF_SIZE = 1048576; From 962c7350f3302385614c6197f6809b62ebf94e14 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 26 Mar 2014 11:53:57 -0700 Subject: [PATCH 6/6] wait on broadcastThread before destroying AvatarMixer, closes #2499 --- assignment-client/src/avatars/AvatarMixer.cpp | 15 +++++++++------ assignment-client/src/avatars/AvatarMixer.h | 4 +++- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index aaf58a7f42..c4c0dcda24 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -32,6 +32,7 @@ const unsigned int AVATAR_DATA_SEND_INTERVAL_MSECS = (1.0f / 60.0f) * 1000; AvatarMixer::AvatarMixer(const QByteArray& packet) : ThreadedAssignment(packet), + _broadcastThread(), _lastFrameTimestamp(QDateTime::currentMSecsSinceEpoch()), _trailingSleepRatio(1.0f), _performanceThrottlingRatio(0.0f), @@ -44,6 +45,11 @@ AvatarMixer::AvatarMixer(const QByteArray& packet) : connect(NodeList::getInstance(), &NodeList::nodeKilled, this, &AvatarMixer::nodeKilled); } +AvatarMixer::~AvatarMixer() { + _broadcastThread.quit(); + _broadcastThread.wait(); +} + void attachAvatarDataToNode(Node* newNode) { if (!newNode->getLinkedData()) { newNode->setLinkedData(new AvatarMixerClientData()); @@ -309,18 +315,15 @@ void AvatarMixer::run() { nodeList->linkedDataCreateCallback = attachAvatarDataToNode; - // create a thead for broadcast of avatar data - QThread* broadcastThread = new QThread(this); - // setup the timer that will be fired on the broadcast thread QTimer* broadcastTimer = new QTimer(); broadcastTimer->setInterval(AVATAR_DATA_SEND_INTERVAL_MSECS); - broadcastTimer->moveToThread(broadcastThread); + broadcastTimer->moveToThread(&_broadcastThread); // connect appropriate signals and slots connect(broadcastTimer, &QTimer::timeout, this, &AvatarMixer::broadcastAvatarData, Qt::DirectConnection); - connect(broadcastThread, SIGNAL(started()), broadcastTimer, SLOT(start())); + connect(&_broadcastThread, SIGNAL(started()), broadcastTimer, SLOT(start())); // start the broadcastThread - broadcastThread->start(); + _broadcastThread.start(); } diff --git a/assignment-client/src/avatars/AvatarMixer.h b/assignment-client/src/avatars/AvatarMixer.h index 4171df49af..c9a145d2da 100644 --- a/assignment-client/src/avatars/AvatarMixer.h +++ b/assignment-client/src/avatars/AvatarMixer.h @@ -15,7 +15,7 @@ class AvatarMixer : public ThreadedAssignment { public: AvatarMixer(const QByteArray& packet); - + ~AvatarMixer(); public slots: /// runs the avatar mixer void run(); @@ -30,6 +30,8 @@ public slots: private: void broadcastAvatarData(); + QThread _broadcastThread; + quint64 _lastFrameTimestamp; float _trailingSleepRatio;