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; 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) { void attachAvatarDataToAgent(Agent *newAgent) {
if (newAgent->getLinkedData() == NULL) { if (newAgent->getLinkedData() == NULL) {
newAgent->setLinkedData(new AvatarAgentData()); newAgent->setLinkedData(new AvatarAgentData());
@ -108,9 +72,6 @@ int main(int argc, char* argv[])
{ {
setvbuf(stdout, NULL, _IOLBF, 0); setvbuf(stdout, NULL, _IOLBF, 0);
pthread_t sendAvatarDataThread;
pthread_create(&sendAvatarDataThread, NULL, sendAvatarData, NULL);
agentList.linkedDataCreateCallback = attachAvatarDataToAgent; agentList.linkedDataCreateCallback = attachAvatarDataToAgent;
agentList.startDomainServerCheckInThread(); agentList.startDomainServerCheckInThread();
@ -121,12 +82,40 @@ int main(int argc, char* argv[])
char *packetData = new char[MAX_PACKET_SIZE]; char *packetData = new char[MAX_PACKET_SIZE];
ssize_t receivedBytes = 0; 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) { while (true) {
if (agentList.getAgentSocket().receive(agentAddress, packetData, &receivedBytes)) { if (agentList.getAgentSocket().receive(agentAddress, packetData, &receivedBytes)) {
switch (packetData[0]) { switch (packetData[0]) {
case PACKET_HEADER_HEAD_DATA: case PACKET_HEADER_HEAD_DATA:
// this is positional data from an agent // this is positional data from an agent
agentList.updateAgentWithData(agentAddress, (void *)packetData, receivedBytes); 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; break;
default: default:
// hand this off to the AgentList // hand this off to the AgentList
@ -140,6 +129,5 @@ int main(int argc, char* argv[])
agentList.stopSilentAgentRemovalThread(); agentList.stopSilentAgentRemovalThread();
agentList.stopPingUnknownAgentsThread(); agentList.stopPingUnknownAgentsThread();
pthread_join(sendAvatarDataThread, NULL);
return 0; return 0;
} }