From 35a8207769a671ac12b984f8b6d7997d1342a399 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Tue, 9 Apr 2013 14:56:11 -0600 Subject: [PATCH] Deleting silent agents --- avatar/src/avatar.cpp | 42 +++++++++++++++++++++++++++++++++++------- avatar/src/avatar.h | 6 +++++- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/avatar/src/avatar.cpp b/avatar/src/avatar.cpp index ca2537546b..e4ca846718 100644 --- a/avatar/src/avatar.cpp +++ b/avatar/src/avatar.cpp @@ -69,7 +69,8 @@ AvatarAgent::AvatarAgent(sockaddr activeSocket, float averageLoudness, float handPositionX, float handPositionY, - float handPositionZ) { + float handPositionZ, + double lastHeartbeat) { this->setActiveSocket(activeSocket); this->setPitch(pitch); @@ -79,6 +80,7 @@ AvatarAgent::AvatarAgent(sockaddr activeSocket, this->setLoudness(loudness); this->setAverageLoudness(averageLoudness); this->setHandPosition(handPositionX, handPositionY, handPositionZ); + this->setLastHeartbeat(lastHeartbeat); } @@ -135,6 +137,10 @@ float AvatarAgent::getHandPositionZ() { return _handPositionZ; } +double AvatarAgent::getLastHeartbeat() { + return _lastHeartbeat; +} + // Property setters void AvatarAgent::setPitch(float pitch) { _pitch = pitch; @@ -168,6 +174,9 @@ void AvatarAgent::setHandPosition(float x, float y, float z) { _handPositionZ = z; } +void AvatarAgent::setLastHeartbeat(double lastHeartbeat) { + _lastHeartbeat = lastHeartbeat; +} unsigned char *addAgentToBroadcastPacket(unsigned char *currentPosition, AvatarAgent *agentToAdd) { unsigned char *packetData = new unsigned char(); @@ -209,24 +218,39 @@ void *sendAvatarData(void *args) { for (std::vector::iterator avatarAgent = avatarAgentList->begin(); avatarAgent != avatarAgentList->end(); avatarAgent++) { - addAgentToBroadcastPacket(currentBufferPosition, &*avatarAgent); - } for (std::vector::iterator avatarAgent = avatarAgentList->begin(); avatarAgent != avatarAgentList->end(); avatarAgent++) { - avatarMixerSocket->send(avatarAgent->getActiveSocket(), broadcastPacket, strlen((const char *)broadcastPacket)); - } double usecToSleep = usecTimestamp(&startTime) + (BROADCAST_INTERVAL * 10000000) - usecTimestampNow(); + delete[] broadcastPacket; usleep(usecToSleep); } } +void *popInactiveAvatarAgents(void *args) { + + double checkTime, sleepTime; + + while (true) { + checkTime = usecTimestampNow(); + + for (std::vector::iterator avatarAgent = avatarAgentList->begin(); + avatarAgent != avatarAgentList->end(); + avatarAgent++) { + if ((checkTime - avatarAgent->getLastHeartbeat()) > AGENT_SILENCE_THRESHOLD_USECS) { + avatarAgent = avatarAgentList->erase(avatarAgent); + } + } + + } +} + int main(int argc, char* argv[]) { setvbuf(stdout, NULL, _IOLBF, 0); @@ -234,6 +258,9 @@ int main(int argc, char* argv[]) pthread_t sendAvatarDataThread; pthread_create(&sendAvatarDataThread, NULL, sendAvatarData, NULL); + pthread_t popInactiveAvatarAgentsThread; + pthread_create(&popInactiveAvatarAgentsThread, NULL, popInactiveAvatarAgents, NULL); + sockaddr *agentAddress = new sockaddr; char *packetData = new char[MAX_PACKET_SIZE]; ssize_t receivedBytes = 0; @@ -273,7 +300,6 @@ int main(int argc, char* argv[]) matchingAgent = findAvatarAgentBySocket(agentAddress); if (matchingAgent) { - // We already have this agent on our list, just modify positional data matchingAgent->setPitch(*pitch); matchingAgent->setYaw(*yaw); @@ -282,6 +308,7 @@ int main(int argc, char* argv[]) matchingAgent->setLoudness(*loudness); matchingAgent->setAverageLoudness(*averageLoudness); matchingAgent->setHandPosition(*handPositionX, *handPositionY, *handPositionZ); + matchingAgent->setLastHeartbeat(usecTimestampNow()); } else { // This is a new agent, we need to add to the list @@ -296,7 +323,8 @@ int main(int argc, char* argv[]) *averageLoudness, *handPositionX, *handPositionY, - *handPositionZ); + *handPositionZ, + usecTimestampNow()); avatarAgentList->push_back(thisAgentHolder); } } diff --git a/avatar/src/avatar.h b/avatar/src/avatar.h index a476e60f29..326f27d71a 100644 --- a/avatar/src/avatar.h +++ b/avatar/src/avatar.h @@ -44,6 +44,7 @@ private: float _handPositionX; float _handPositionY; float _handPositionZ; + double _lastHeartbeat; public: AvatarAgent(sockaddr activeSocket, float pitch, @@ -56,7 +57,8 @@ public: float averageLoudness, float handPositionX, float handPositionY, - float handPositionZ); + float handPositionZ, + double lastHeartbeat); ~AvatarAgent(); sockaddr *getActiveSocket(); void setActiveSocket(sockaddr activeSocket); @@ -78,4 +80,6 @@ public: float getHandPositionY(); float getHandPositionZ(); void setHandPosition(float x, float y, float z); + double getLastHeartbeat(); + void setLastHeartbeat(double lastHeartbeat); }; \ No newline at end of file