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 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<AvatarAgent>::iterator avatarAgent = avatarAgentList->begin();
avatarAgent != avatarAgentList->end();
avatarAgent++) {
addAgentToBroadcastPacket(currentBufferPosition, &*avatarAgent);
}
for (std::vector<AvatarAgent>::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<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[])
{
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);
}
}

View file

@ -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);
};