From bdde66fec8432b5a221e52a703a109f5e69b97e0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 11 Apr 2013 09:53:24 -0700 Subject: [PATCH] have avatar mixer reply with bulk packet immediately on receive --- avatar/src/main.cpp | 68 +++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 40 deletions(-) diff --git a/avatar/src/main.cpp b/avatar/src/main.cpp index 73d3a3b6ba..fcaef1045c 100644 --- a/avatar/src/main.cpp +++ b/avatar/src/main.cpp @@ -62,42 +62,6 @@ unsigned char *addAgentToBroadcastPacket(unsigned char *currentPosition, Agent * return currentPosition; } -void *sendAvatarData(void *args) { - timeval startTime; - - unsigned char *broadcastPacket = new unsigned char[MAX_PACKET_SIZE]; - *broadcastPacket = PACKET_HEADER_AVATAR_SERVER; - - unsigned char* currentBufferPosition = NULL; - - while (true) { - gettimeofday(&startTime, NULL); - - currentBufferPosition = broadcastPacket + 1; - - for (std::vector::iterator avatarAgent = agentList.getAgents().begin(); - avatarAgent != agentList.getAgents().end(); - avatarAgent++) { - if (avatarAgent->getLinkedData() != NULL) { - currentBufferPosition = addAgentToBroadcastPacket(currentBufferPosition, &*avatarAgent); - } - } - - for (std::vector::iterator avatarAgent = agentList.getAgents().begin(); - avatarAgent != agentList.getAgents().end(); - avatarAgent++) { - if (avatarAgent->getActiveSocket()) { - agentList.getAgentSocket().send(avatarAgent->getPublicSocket(), - broadcastPacket, - currentBufferPosition - broadcastPacket); - } - } - - double usecToSleep = BROADCAST_INTERVAL_USECS - (usecTimestampNow() - usecTimestamp(&startTime)); - usleep(usecToSleep); - } -} - void attachAvatarDataToAgent(Agent *newAgent) { if (newAgent->getLinkedData() == NULL) { newAgent->setLinkedData(new AvatarAgentData()); @@ -108,9 +72,6 @@ int main(int argc, char* argv[]) { setvbuf(stdout, NULL, _IOLBF, 0); - pthread_t sendAvatarDataThread; - pthread_create(&sendAvatarDataThread, NULL, sendAvatarData, NULL); - agentList.linkedDataCreateCallback = attachAvatarDataToAgent; agentList.startDomainServerCheckInThread(); @@ -120,6 +81,12 @@ int main(int argc, char* argv[]) sockaddr *agentAddress = new sockaddr; char *packetData = new char[MAX_PACKET_SIZE]; ssize_t receivedBytes = 0; + + unsigned char *broadcastPacket = new unsigned char[MAX_PACKET_SIZE]; + *broadcastPacket = PACKET_HEADER_AVATAR_SERVER; + + unsigned char* currentBufferPosition = NULL; + int agentIndex = 0; while (true) { if (agentList.getAgentSocket().receive(agentAddress, packetData, &receivedBytes)) { @@ -127,6 +94,28 @@ int main(int argc, char* argv[]) case PACKET_HEADER_HEAD_DATA: // this is positional data from an agent agentList.updateAgentWithData(agentAddress, (void *)packetData, receivedBytes); + + currentBufferPosition = broadcastPacket + 1; + agentIndex = 0; + + // send back a packet with other active agent data to this agent + for (std::vector::iterator avatarAgent = agentList.getAgents().begin(); + avatarAgent != agentList.getAgents().end(); + avatarAgent++) { + if (avatarAgent->getLinkedData() != NULL + && agentIndex != agentList.indexOfMatchingAgent(agentAddress)) { + currentBufferPosition = addAgentToBroadcastPacket(currentBufferPosition, &*avatarAgent); + } + + agentIndex++; + } + + if (currentBufferPosition - broadcastPacket > 1) { + agentList.getAgentSocket().send(agentAddress, + broadcastPacket, + currentBufferPosition - broadcastPacket); + } + break; default: // hand this off to the AgentList @@ -140,6 +129,5 @@ int main(int argc, char* argv[]) agentList.stopSilentAgentRemovalThread(); agentList.stopPingUnknownAgentsThread(); - pthread_join(sendAvatarDataThread, NULL); return 0; }