From cbf8a2c202c7b5e487c80bc758ffcf16a8c8aa30 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 6 Sep 2013 16:03:54 -0700 Subject: [PATCH] use create time already being stored with assignment to decide on re-send --- domain-server/src/main.cpp | 49 ++++++++++++++++------------- libraries/shared/src/Assignment.cpp | 38 +++++++++++----------- libraries/shared/src/Assignment.h | 5 +++ 3 files changed, 50 insertions(+), 42 deletions(-) diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index 6de926a7a7..32a88e8e08 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -92,40 +92,42 @@ int main(int argc, const char* argv[]) { nodeList->setAssignmentServerHostname(getCmdOption(argc, argv, "-a")); // use a map to keep track of iterations of silence for assignment creation requests - const int ASSIGNMENT_SILENCE_MAX_ITERATIONS = 5; - std::map assignmentSilenceCount; + const long long ASSIGNMENT_SILENCE_MAX_USECS = 5 * 1000 * 1000; // as a domain-server we will always want an audio mixer and avatar mixer - // setup the create assignments for those - Assignment audioAssignment(Assignment::Create, Assignment::AudioMixer, assignmentPool); - Assignment avatarAssignment(Assignment::Create, Assignment::AvatarMixer, assignmentPool); + // setup the create assignment pointers for those + Assignment *audioAssignment = NULL; + Assignment *avatarAssignment = NULL; while (true) { if (!nodeList->soloNodeOfType(NODE_TYPE_AUDIO_MIXER)) { - std::map::iterator countIt = assignmentSilenceCount.find(&audioAssignment); - if (countIt == assignmentSilenceCount.end() || countIt->second == ASSIGNMENT_SILENCE_MAX_ITERATIONS) { - nodeList->sendAssignment(audioAssignment); - assignmentSilenceCount[&audioAssignment] = 0; - } else { - assignmentSilenceCount[&audioAssignment]++; + if (!audioAssignment + || usecTimestampNow() - usecTimestamp(&audioAssignment->getTime()) >= ASSIGNMENT_SILENCE_MAX_USECS) { + + if (!audioAssignment) { + audioAssignment = new Assignment(Assignment::Create, Assignment::AudioMixer, assignmentPool); + } + + nodeList->sendAssignment(*audioAssignment); + audioAssignment->setCreateTimeToNow(); } - } else { - assignmentSilenceCount[&audioAssignment] = 0; } if (!nodeList->soloNodeOfType(NODE_TYPE_AVATAR_MIXER)) { - std::map::iterator countIt = assignmentSilenceCount.find(&avatarAssignment); - if (countIt == assignmentSilenceCount.end() || countIt->second == ASSIGNMENT_SILENCE_MAX_ITERATIONS) { - nodeList->sendAssignment(avatarAssignment); - assignmentSilenceCount[&avatarAssignment] = 0; - } else { - assignmentSilenceCount[&avatarAssignment]++; + if (!avatarAssignment + || usecTimestampNow() - usecTimestamp(&avatarAssignment->getTime()) >= ASSIGNMENT_SILENCE_MAX_USECS) { + if (!avatarAssignment) { + avatarAssignment = new Assignment(Assignment::Create, Assignment::AvatarMixer, assignmentPool); + } + + nodeList->sendAssignment(*avatarAssignment); + + // reset the create time on the assignment so re-request is in ASSIGNMENT_SILENCE_MAX_USECS + avatarAssignment->setCreateTimeToNow(); } - } else { - assignmentSilenceCount[&avatarAssignment] = 0; + } - if (nodeList->getNodeSocket()->receive((sockaddr *)&nodePublicAddress, packetData, &receivedBytes) && (packetData[0] == PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY || packetData[0] == PACKET_TYPE_DOMAIN_LIST_REQUEST) && packetVersionMatch(packetData)) { @@ -236,6 +238,9 @@ int main(int argc, const char* argv[]) { } } } + + delete audioAssignment; + delete avatarAssignment; return 0; } diff --git a/libraries/shared/src/Assignment.cpp b/libraries/shared/src/Assignment.cpp index 3c6e432f2c..850922396f 100644 --- a/libraries/shared/src/Assignment.cpp +++ b/libraries/shared/src/Assignment.cpp @@ -6,8 +6,6 @@ // Copyright (c) 2013 HighFidelity, Inc. All rights reserved. // -#include - #include "PacketHeaders.h" #include "Assignment.h" @@ -86,6 +84,24 @@ Assignment::~Assignment() { delete _pool; } +void Assignment::setDomainSocket(const sockaddr* domainSocket) { + + if (_domainSocket) { + // delete the old _domainSocket if it exists + delete _domainSocket; + _domainSocket = NULL; + } + + // create a new sockaddr or sockaddr_in depending on what type of address this is + if (domainSocket->sa_family == AF_INET) { + _domainSocket = (sockaddr*) new sockaddr_in; + memcpy(_domainSocket, domainSocket, sizeof(sockaddr_in)); + } else { + _domainSocket = (sockaddr*) new sockaddr_in6; + memcpy(_domainSocket, domainSocket, sizeof(sockaddr_in6)); + } +} + int Assignment::packToBuffer(unsigned char* buffer) { int numPackedBytes = 0; @@ -114,24 +130,6 @@ int Assignment::packToBuffer(unsigned char* buffer) { return numPackedBytes; } -void Assignment::setDomainSocket(const sockaddr* domainSocket) { - - if (_domainSocket) { - // delete the old _domainSocket if it exists - delete _domainSocket; - _domainSocket = NULL; - } - - // create a new sockaddr or sockaddr_in depending on what type of address this is - if (domainSocket->sa_family == AF_INET) { - _domainSocket = (sockaddr*) new sockaddr_in; - memcpy(_domainSocket, domainSocket, sizeof(sockaddr_in)); - } else { - _domainSocket = (sockaddr*) new sockaddr_in6; - memcpy(_domainSocket, domainSocket, sizeof(sockaddr_in6)); - } -} - QDebug operator<<(QDebug debug, const Assignment &assignment) { debug << "T:" << assignment.getType() << "P:" << assignment.getPool(); return debug.nospace(); diff --git a/libraries/shared/src/Assignment.h b/libraries/shared/src/Assignment.h index 2c2673f351..693cc42577 100644 --- a/libraries/shared/src/Assignment.h +++ b/libraries/shared/src/Assignment.h @@ -9,6 +9,8 @@ #ifndef __hifi__Assignment__ #define __hifi__Assignment__ +#include + #include "NodeList.h" /// Holds information used for request, creation, and deployment of assignments @@ -49,6 +51,9 @@ public: /// \return number of bytes packed into buffer int packToBuffer(unsigned char* buffer); + /// Sets _time to the current time given by gettimeofday + void setCreateTimeToNow() { gettimeofday(&_time, NULL); } + private: Assignment::Direction _direction; /// the direction of the assignment (Create, Deploy, Request) Assignment::Type _type; /// the type of the assignment, defines what the assignee will do