diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 1daba493d9..2474668fe9 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -457,8 +457,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : audioThread->start(); - - QThread* assetThread = new QThread(); + QThread* assetThread = new QThread; assetThread->setObjectName("Asset Thread"); auto assetClient = DependencyManager::get(); @@ -467,7 +466,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : assetThread->start(); - const DomainHandler& domainHandler = nodeList->getDomainHandler(); connect(&domainHandler, SIGNAL(hostnameChanged(const QString&)), SLOT(domainChanged(const QString&))); @@ -878,6 +876,12 @@ Application::~Application() { DependencyManager::destroy(); DependencyManager::destroy(); DependencyManager::destroy(); + + // cleanup the AssetClient thread + QThread* assetThread = DependencyManager::get()->thread(); + DependencyManager::destroy(); + assetThread->quit(); + assetThread->wait(); QThread* nodeThread = DependencyManager::get()->thread(); @@ -887,7 +891,7 @@ Application::~Application() { // ask the node thread to quit and wait until it is done nodeThread->quit(); nodeThread->wait(); - + Leapmotion::destroy(); RealSense::destroy(); ConnexionClient::getInstance().destroy(); diff --git a/libraries/networking/src/AssetClient.cpp b/libraries/networking/src/AssetClient.cpp index 68b7c5ad76..65806f3e96 100644 --- a/libraries/networking/src/AssetClient.cpp +++ b/libraries/networking/src/AssetClient.cpp @@ -24,6 +24,11 @@ MessageID AssetClient::_currentID = 0; AssetClient::AssetClient() { + + setCustomDeleter([](Dependency* dependency){ + static_cast(dependency)->deleteLater(); + }); + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver.registerListener(PacketType::AssetGetInfoReply, this, "handleAssetGetInfoReply"); packetReceiver.registerMessageListener(PacketType::AssetGetReply, this, "handleAssetGetReply"); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index e5923b059f..2d1c98287c 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -66,7 +66,7 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short firstCall = false; } - + qRegisterMetaType("ConnectionStep"); _nodeSocket.bind(QHostAddress::AnyIPv4, socketListenPort); diff --git a/libraries/networking/src/udt/Connection.cpp b/libraries/networking/src/udt/Connection.cpp index 7f5ad0c1a0..b473844c35 100644 --- a/libraries/networking/src/udt/Connection.cpp +++ b/libraries/networking/src/udt/Connection.cpp @@ -853,30 +853,32 @@ void PendingReceivedMessage::enqueuePacket(std::unique_ptr packet) { return; } + auto sequenceNumber = packet->getSequenceNumber(); + if (packet->getPacketPosition() == Packet::PacketPosition::FIRST) { _hasFirstSequenceNumber = true; - _firstSequenceNumber = packet->getSequenceNumber(); + _firstSequenceNumber = sequenceNumber; } else if (packet->getPacketPosition() == Packet::PacketPosition::LAST) { _hasLastSequenceNumber = true; - _lastSequenceNumber = packet->getSequenceNumber(); + _lastSequenceNumber = sequenceNumber; } else if (packet->getPacketPosition() == Packet::PacketPosition::ONLY) { _hasFirstSequenceNumber = true; _hasLastSequenceNumber = true; - _firstSequenceNumber = packet->getSequenceNumber(); - _lastSequenceNumber = packet->getSequenceNumber(); + _firstSequenceNumber = sequenceNumber; + _lastSequenceNumber = sequenceNumber; } - _packets.push_back(std::move(packet)); + // Insert into the packets list in sorted order. Because we generally expect to receive packets in order, begin + // searching from the end of the list. + auto it = find_if(_packets.rbegin(), _packets.rend(), + [&](const std::unique_ptr& packet) { return sequenceNumber > packet->getSequenceNumber(); }); + } + _packets.insert(it.base(), std::move(packet)); if (_hasFirstSequenceNumber && _hasLastSequenceNumber) { auto numPackets = udt::seqlen(_firstSequenceNumber, _lastSequenceNumber); if (uint64_t(numPackets) == _packets.size()) { _isComplete = true; - - // Sort packets by sequence number - _packets.sort([](std::unique_ptr& a, std::unique_ptr& b) { - return a->getSequenceNumber() < b->getSequenceNumber(); - }); } } } diff --git a/libraries/networking/src/udt/SendQueue.cpp b/libraries/networking/src/udt/SendQueue.cpp index 7abb195005..ff53bcfc54 100644 --- a/libraries/networking/src/udt/SendQueue.cpp +++ b/libraries/networking/src/udt/SendQueue.cpp @@ -55,7 +55,7 @@ std::unique_ptr SendQueue::create(Socket* socket, HifiSockAddr destin Q_ASSERT_X(socket, "SendQueue::create", "Must be called with a valid Socket*"); // Setup queue private thread - QThread* thread = new QThread(); + QThread* thread = new QThread; thread->setObjectName("Networking: SendQueue " + destination.objectName()); // Name thread for easier debug connect(thread, &QThread::started, queue.get(), &SendQueue::run); diff --git a/libraries/networking/src/udt/Socket.cpp b/libraries/networking/src/udt/Socket.cpp index 805da8790e..37bc88ac49 100644 --- a/libraries/networking/src/udt/Socket.cpp +++ b/libraries/networking/src/udt/Socket.cpp @@ -28,7 +28,8 @@ Q_DECLARE_METATYPE(Packet*); Q_DECLARE_METATYPE(PacketList*); Socket::Socket(QObject* parent) : - QObject(parent) + QObject(parent), + _synTimer(new QTimer(this)) { qRegisterMetaType(); qRegisterMetaType(); @@ -36,10 +37,10 @@ Socket::Socket(QObject* parent) : connect(&_udpSocket, &QUdpSocket::readyRead, this, &Socket::readPendingDatagrams); // make sure our synchronization method is called every SYN interval - connect(&_synTimer, &QTimer::timeout, this, &Socket::rateControlSync); + connect(_synTimer, &QTimer::timeout, this, &Socket::rateControlSync); // start our timer for the synchronization time interval - _synTimer.start(_synInterval); + _synTimer->start(_synInterval); } void Socket::rebind() { @@ -300,10 +301,10 @@ void Socket::rateControlSync() { connection.second->sync(); } - if (_synTimer.interval() != _synInterval) { + if (_synTimer->interval() != _synInterval) { // if the _synTimer interval doesn't match the current _synInterval (changes when the CC factory is changed) // then restart it now with the right interval - _synTimer.start(_synInterval); + _synTimer->start(_synInterval); } } diff --git a/libraries/networking/src/udt/Socket.h b/libraries/networking/src/udt/Socket.h index 2809ec795a..414f923901 100644 --- a/libraries/networking/src/udt/Socket.h +++ b/libraries/networking/src/udt/Socket.h @@ -101,7 +101,7 @@ private: std::unordered_map> _connectionsHash; int _synInterval = 10; // 10ms - QTimer _synTimer; + QTimer* _synTimer; std::unique_ptr _ccFactory { new CongestionControlFactory() }; diff --git a/libraries/shared/src/GenericThread.cpp b/libraries/shared/src/GenericThread.cpp index be984d5899..18f5224229 100644 --- a/libraries/shared/src/GenericThread.cpp +++ b/libraries/shared/src/GenericThread.cpp @@ -19,6 +19,7 @@ GenericThread::GenericThread(QObject* parent) : _stopThread(false), _isThreaded(false) // assume non-threaded, must call initialize() { + } GenericThread::~GenericThread() { @@ -32,7 +33,7 @@ void GenericThread::initialize(bool isThreaded, QThread::Priority priority) { _isThreaded = isThreaded; if (_isThreaded) { _thread = new QThread(this); - + // match the thread name to our object name _thread->setObjectName(objectName());