have avatar mixer reply with bulk packet immediately on receive

This commit is contained in:
Stephen Birarda 2013-04-11 09:53:24 -07:00
parent 3823809497
commit bdde66fec8

View file

@ -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<Agent>::iterator avatarAgent = agentList.getAgents().begin();
avatarAgent != agentList.getAgents().end();
avatarAgent++) {
if (avatarAgent->getLinkedData() != NULL) {
currentBufferPosition = addAgentToBroadcastPacket(currentBufferPosition, &*avatarAgent);
}
}
for (std::vector<Agent>::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<Agent>::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;
}