mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-04 14:43:12 +02:00
117 lines
4 KiB
C++
117 lines
4 KiB
C++
//
|
|
// ThreadedAssignment.cpp
|
|
// libraries/shared/src
|
|
//
|
|
// Created by Stephen Birarda on 12/3/2013.
|
|
// Copyright 2013 High Fidelity, Inc.
|
|
//
|
|
// Distributed under the Apache License, Version 2.0.
|
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
//
|
|
|
|
#include <QtCore/QCoreApplication>
|
|
#include <QtCore/QJsonObject>
|
|
#include <QtCore/QThread>
|
|
#include <QtCore/QTimer>
|
|
|
|
#include <LogHandler.h>
|
|
|
|
#include "ThreadedAssignment.h"
|
|
|
|
ThreadedAssignment::ThreadedAssignment(ReceivedMessage& message) :
|
|
Assignment(message),
|
|
_isFinished(false),
|
|
_domainServerTimer(this),
|
|
_statsTimer(this)
|
|
{
|
|
static const int STATS_TIMEOUT_MS = 1000;
|
|
_statsTimer.setInterval(STATS_TIMEOUT_MS);
|
|
connect(&_statsTimer, &QTimer::timeout, this, &ThreadedAssignment::sendStatsPacket);
|
|
|
|
connect(&_domainServerTimer, &QTimer::timeout, this, &ThreadedAssignment::checkInWithDomainServerOrExit);
|
|
_domainServerTimer.setInterval(DOMAIN_SERVER_CHECK_IN_MSECS);
|
|
}
|
|
|
|
void ThreadedAssignment::setFinished(bool isFinished) {
|
|
if (_isFinished != isFinished) {
|
|
_isFinished = isFinished;
|
|
|
|
if (_isFinished) {
|
|
|
|
qDebug() << "ThreadedAssignment::setFinished(true) called - finishing up.";
|
|
|
|
auto nodeList = DependencyManager::get<NodeList>();
|
|
|
|
auto& packetReceiver = nodeList->getPacketReceiver();
|
|
|
|
// we should de-register immediately for any of our packets
|
|
packetReceiver.unregisterListener(this);
|
|
|
|
// we should also tell the packet receiver to drop packets while we're cleaning up
|
|
packetReceiver.setShouldDropPackets(true);
|
|
|
|
// send a disconnect packet to the domain
|
|
nodeList->getDomainHandler().disconnect();
|
|
|
|
// stop our owned timers
|
|
_domainServerTimer.stop();
|
|
_statsTimer.stop();
|
|
|
|
// call our virtual aboutToFinish method - this gives the ThreadedAssignment subclass a chance to cleanup
|
|
aboutToFinish();
|
|
|
|
emit finished();
|
|
}
|
|
}
|
|
}
|
|
|
|
void ThreadedAssignment::commonInit(const QString& targetName, NodeType_t nodeType) {
|
|
// change the logging target name while the assignment is running
|
|
LogHandler::getInstance().setTargetName(targetName);
|
|
|
|
auto nodeList = DependencyManager::get<NodeList>();
|
|
nodeList->setOwnerType(nodeType);
|
|
|
|
// send a domain-server check in immediately and start the timer to fire them every DOMAIN_SERVER_CHECK_IN_MSECS
|
|
checkInWithDomainServerOrExit();
|
|
_domainServerTimer.start();
|
|
|
|
// start sending stats packet once we connect to the domain
|
|
connect(&nodeList->getDomainHandler(), SIGNAL(connectedToDomain(const QString&)), &_statsTimer, SLOT(start()));
|
|
|
|
// stop sending stats if we disconnect
|
|
connect(&nodeList->getDomainHandler(), &DomainHandler::disconnectedFromDomain, &_statsTimer, &QTimer::stop);
|
|
}
|
|
|
|
void ThreadedAssignment::addPacketStatsAndSendStatsPacket(QJsonObject &statsObject) {
|
|
auto nodeList = DependencyManager::get<NodeList>();
|
|
|
|
float packetsPerSecond, bytesPerSecond;
|
|
// XXX can BandwidthRecorder be used for this?
|
|
nodeList->getPacketStats(packetsPerSecond, bytesPerSecond);
|
|
nodeList->resetPacketStats();
|
|
|
|
statsObject["packets_per_second"] = packetsPerSecond;
|
|
statsObject["bytes_per_second"] = bytesPerSecond;
|
|
|
|
nodeList->sendStatsToDomainServer(statsObject);
|
|
}
|
|
|
|
void ThreadedAssignment::sendStatsPacket() {
|
|
QJsonObject statsObject;
|
|
addPacketStatsAndSendStatsPacket(statsObject);
|
|
}
|
|
|
|
void ThreadedAssignment::checkInWithDomainServerOrExit() {
|
|
if (DependencyManager::get<NodeList>()->getNumNoReplyDomainCheckIns() == MAX_SILENT_DOMAIN_SERVER_CHECK_INS) {
|
|
setFinished(true);
|
|
} else {
|
|
auto nodeList = DependencyManager::get<NodeList>();
|
|
QMetaObject::invokeMethod(nodeList.data(), "sendDomainServerCheckIn");
|
|
}
|
|
}
|
|
|
|
void ThreadedAssignment::domainSettingsRequestFailed() {
|
|
qDebug() << "Failed to retreive settings object from domain-server. Bailing on assignment.";
|
|
setFinished(true);
|
|
}
|