Deleting silent agents

This commit is contained in:
Leonardo Murillo 2013-04-09 14:56:11 -06:00
parent 64e563ef7c
commit 35a8207769
2 changed files with 40 additions and 8 deletions

View file

@ -69,7 +69,8 @@ AvatarAgent::AvatarAgent(sockaddr activeSocket,
float averageLoudness, float averageLoudness,
float handPositionX, float handPositionX,
float handPositionY, float handPositionY,
float handPositionZ) { float handPositionZ,
double lastHeartbeat) {
this->setActiveSocket(activeSocket); this->setActiveSocket(activeSocket);
this->setPitch(pitch); this->setPitch(pitch);
@ -79,6 +80,7 @@ AvatarAgent::AvatarAgent(sockaddr activeSocket,
this->setLoudness(loudness); this->setLoudness(loudness);
this->setAverageLoudness(averageLoudness); this->setAverageLoudness(averageLoudness);
this->setHandPosition(handPositionX, handPositionY, handPositionZ); this->setHandPosition(handPositionX, handPositionY, handPositionZ);
this->setLastHeartbeat(lastHeartbeat);
} }
@ -135,6 +137,10 @@ float AvatarAgent::getHandPositionZ() {
return _handPositionZ; return _handPositionZ;
} }
double AvatarAgent::getLastHeartbeat() {
return _lastHeartbeat;
}
// Property setters // Property setters
void AvatarAgent::setPitch(float pitch) { void AvatarAgent::setPitch(float pitch) {
_pitch = pitch; _pitch = pitch;
@ -168,6 +174,9 @@ void AvatarAgent::setHandPosition(float x, float y, float z) {
_handPositionZ = z; _handPositionZ = z;
} }
void AvatarAgent::setLastHeartbeat(double lastHeartbeat) {
_lastHeartbeat = lastHeartbeat;
}
unsigned char *addAgentToBroadcastPacket(unsigned char *currentPosition, AvatarAgent *agentToAdd) { unsigned char *addAgentToBroadcastPacket(unsigned char *currentPosition, AvatarAgent *agentToAdd) {
unsigned char *packetData = new unsigned char(); unsigned char *packetData = new unsigned char();
@ -209,24 +218,39 @@ void *sendAvatarData(void *args) {
for (std::vector<AvatarAgent>::iterator avatarAgent = avatarAgentList->begin(); for (std::vector<AvatarAgent>::iterator avatarAgent = avatarAgentList->begin();
avatarAgent != avatarAgentList->end(); avatarAgent != avatarAgentList->end();
avatarAgent++) { avatarAgent++) {
addAgentToBroadcastPacket(currentBufferPosition, &*avatarAgent); addAgentToBroadcastPacket(currentBufferPosition, &*avatarAgent);
} }
for (std::vector<AvatarAgent>::iterator avatarAgent = avatarAgentList->begin(); for (std::vector<AvatarAgent>::iterator avatarAgent = avatarAgentList->begin();
avatarAgent != avatarAgentList->end(); avatarAgent != avatarAgentList->end();
avatarAgent++) { avatarAgent++) {
avatarMixerSocket->send(avatarAgent->getActiveSocket(), broadcastPacket, strlen((const char *)broadcastPacket)); avatarMixerSocket->send(avatarAgent->getActiveSocket(), broadcastPacket, strlen((const char *)broadcastPacket));
} }
double usecToSleep = usecTimestamp(&startTime) + (BROADCAST_INTERVAL * 10000000) - usecTimestampNow(); double usecToSleep = usecTimestamp(&startTime) + (BROADCAST_INTERVAL * 10000000) - usecTimestampNow();
delete[] broadcastPacket;
usleep(usecToSleep); usleep(usecToSleep);
} }
} }
void *popInactiveAvatarAgents(void *args) {
double checkTime, sleepTime;
while (true) {
checkTime = usecTimestampNow();
for (std::vector<AvatarAgent>::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[]) int main(int argc, char* argv[])
{ {
setvbuf(stdout, NULL, _IOLBF, 0); setvbuf(stdout, NULL, _IOLBF, 0);
@ -234,6 +258,9 @@ int main(int argc, char* argv[])
pthread_t sendAvatarDataThread; pthread_t sendAvatarDataThread;
pthread_create(&sendAvatarDataThread, NULL, sendAvatarData, NULL); pthread_create(&sendAvatarDataThread, NULL, sendAvatarData, NULL);
pthread_t popInactiveAvatarAgentsThread;
pthread_create(&popInactiveAvatarAgentsThread, NULL, popInactiveAvatarAgents, NULL);
sockaddr *agentAddress = new sockaddr; sockaddr *agentAddress = new sockaddr;
char *packetData = new char[MAX_PACKET_SIZE]; char *packetData = new char[MAX_PACKET_SIZE];
ssize_t receivedBytes = 0; ssize_t receivedBytes = 0;
@ -273,7 +300,6 @@ int main(int argc, char* argv[])
matchingAgent = findAvatarAgentBySocket(agentAddress); matchingAgent = findAvatarAgentBySocket(agentAddress);
if (matchingAgent) { if (matchingAgent) {
// We already have this agent on our list, just modify positional data // We already have this agent on our list, just modify positional data
matchingAgent->setPitch(*pitch); matchingAgent->setPitch(*pitch);
matchingAgent->setYaw(*yaw); matchingAgent->setYaw(*yaw);
@ -282,6 +308,7 @@ int main(int argc, char* argv[])
matchingAgent->setLoudness(*loudness); matchingAgent->setLoudness(*loudness);
matchingAgent->setAverageLoudness(*averageLoudness); matchingAgent->setAverageLoudness(*averageLoudness);
matchingAgent->setHandPosition(*handPositionX, *handPositionY, *handPositionZ); matchingAgent->setHandPosition(*handPositionX, *handPositionY, *handPositionZ);
matchingAgent->setLastHeartbeat(usecTimestampNow());
} else { } else {
// This is a new agent, we need to add to the list // This is a new agent, we need to add to the list
@ -296,7 +323,8 @@ int main(int argc, char* argv[])
*averageLoudness, *averageLoudness,
*handPositionX, *handPositionX,
*handPositionY, *handPositionY,
*handPositionZ); *handPositionZ,
usecTimestampNow());
avatarAgentList->push_back(thisAgentHolder); avatarAgentList->push_back(thisAgentHolder);
} }
} }

View file

@ -44,6 +44,7 @@ private:
float _handPositionX; float _handPositionX;
float _handPositionY; float _handPositionY;
float _handPositionZ; float _handPositionZ;
double _lastHeartbeat;
public: public:
AvatarAgent(sockaddr activeSocket, AvatarAgent(sockaddr activeSocket,
float pitch, float pitch,
@ -56,7 +57,8 @@ public:
float averageLoudness, float averageLoudness,
float handPositionX, float handPositionX,
float handPositionY, float handPositionY,
float handPositionZ); float handPositionZ,
double lastHeartbeat);
~AvatarAgent(); ~AvatarAgent();
sockaddr *getActiveSocket(); sockaddr *getActiveSocket();
void setActiveSocket(sockaddr activeSocket); void setActiveSocket(sockaddr activeSocket);
@ -78,4 +80,6 @@ public:
float getHandPositionY(); float getHandPositionY();
float getHandPositionZ(); float getHandPositionZ();
void setHandPosition(float x, float y, float z); void setHandPosition(float x, float y, float z);
double getLastHeartbeat();
void setLastHeartbeat(double lastHeartbeat);
}; };