diff --git a/avatar/src/main.cpp b/avatar/src/main.cpp index 6bd50cf93a..f59a2f8bcb 100644 --- a/avatar/src/main.cpp +++ b/avatar/src/main.cpp @@ -37,8 +37,6 @@ const int AVATAR_LISTEN_PORT = 55444; const unsigned short BROADCAST_INTERVAL_USECS = 20 * 1000 * 1000; -AgentList agentList(AGENT_TYPE_AVATAR_MIXER, AVATAR_LISTEN_PORT); - unsigned char *addAgentToBroadcastPacket(unsigned char *currentPosition, Agent *agentToAdd) { currentPosition += packSocket(currentPosition, agentToAdd->getPublicSocket()); @@ -70,13 +68,14 @@ void attachAvatarDataToAgent(Agent *newAgent) { int main(int argc, char* argv[]) { + AgentList *agentList = AgentList::createInstance(AGENT_TYPE_AVATAR_MIXER, AVATAR_LISTEN_PORT); setvbuf(stdout, NULL, _IOLBF, 0); - agentList.linkedDataCreateCallback = attachAvatarDataToAgent; + agentList->linkedDataCreateCallback = attachAvatarDataToAgent; - agentList.startDomainServerCheckInThread(); - agentList.startSilentAgentRemovalThread(); - agentList.startPingUnknownAgentsThread(); + agentList->startDomainServerCheckInThread(); + agentList->startSilentAgentRemovalThread(); + agentList->startPingUnknownAgentsThread(); sockaddr *agentAddress = new sockaddr; char *packetData = new char[MAX_PACKET_SIZE]; @@ -89,43 +88,43 @@ int main(int argc, char* argv[]) int agentIndex = 0; while (true) { - if (agentList.getAgentSocket().receive(agentAddress, packetData, &receivedBytes)) { + if (agentList->getAgentSocket().receive(agentAddress, packetData, &receivedBytes)) { switch (packetData[0]) { case PACKET_HEADER_HEAD_DATA: // 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::iterator avatarAgent = agentList.getAgents().begin(); - avatarAgent != agentList.getAgents().end(); + for (std::vector::iterator avatarAgent = agentList->getAgents().begin(); + avatarAgent != agentList->getAgents().end(); avatarAgent++) { if (avatarAgent->getLinkedData() != NULL - && agentIndex != agentList.indexOfMatchingAgent(agentAddress)) { + && agentIndex != agentList->indexOfMatchingAgent(agentAddress)) { currentBufferPosition = addAgentToBroadcastPacket(currentBufferPosition, &*avatarAgent); } agentIndex++; } - agentList.getAgentSocket().send(agentAddress, + agentList->getAgentSocket().send(agentAddress, broadcastPacket, currentBufferPosition - broadcastPacket); break; default: // hand this off to the AgentList - agentList.processAgentData(agentAddress, (void *)packetData, receivedBytes); + agentList->processAgentData(agentAddress, (void *)packetData, receivedBytes); break; } } } - agentList.stopDomainServerCheckInThread(); - agentList.stopSilentAgentRemovalThread(); - agentList.stopPingUnknownAgentsThread(); + agentList->stopDomainServerCheckInThread(); + agentList->stopSilentAgentRemovalThread(); + agentList->stopPingUnknownAgentsThread(); return 0; } diff --git a/domain/src/main.cpp b/domain/src/main.cpp index 786bbda482..8ab62eaeeb 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -48,7 +48,6 @@ const int LOGOFF_CHECK_INTERVAL = 5000; #define DEBUG_TO_SELF 0 int lastActiveCount = 0; -AgentList agentList(AGENT_TYPE_DOMAIN, DOMAIN_LISTEN_PORT); unsigned char * addAgentToBroadcastPacket(unsigned char *currentPosition, Agent *agentToAdd) { *currentPosition++ = agentToAdd->getType(); @@ -63,6 +62,7 @@ unsigned char * addAgentToBroadcastPacket(unsigned char *currentPosition, Agent int main(int argc, const char * argv[]) { + AgentList *agentList = AgentList::createInstance(AGENT_TYPE_DOMAIN, DOMAIN_LISTEN_PORT); // If user asks to run in "local" mode then we do NOT replace the IP // with the EC2 IP. Otherwise, we will replace the IP like we used to // this allows developers to run a local domain without recompiling the @@ -95,10 +95,10 @@ int main(int argc, const char * argv[]) in_addr_t serverLocalAddress = getLocalAddress(); - agentList.startSilentAgentRemovalThread(); + agentList->startSilentAgentRemovalThread(); while (true) { - if (agentList.getAgentSocket().receive((sockaddr *)&agentPublicAddress, packetData, &receivedBytes)) { + if (agentList->getAgentSocket().receive((sockaddr *)&agentPublicAddress, packetData, &receivedBytes)) { std::map newestSoloAgents; agentType = packetData[0]; @@ -115,20 +115,20 @@ int main(int argc, const char * argv[]) } } - if (agentList.addOrUpdateAgent((sockaddr *)&agentPublicAddress, + if (agentList->addOrUpdateAgent((sockaddr *)&agentPublicAddress, (sockaddr *)&agentLocalAddress, agentType, - agentList.getLastAgentId())) { + agentList->getLastAgentId())) { - agentList.increaseAgentId(); + agentList->increaseAgentId(); } currentBufferPos = broadcastPacket + 1; startPointer = currentBufferPos; - for(std::vector::iterator agent = agentList.getAgents().begin(); - agent != agentList.getAgents().end(); + for(std::vector::iterator agent = agentList->getAgents().begin(); + agent != agentList->getAgents().end(); agent++) { if (DEBUG_TO_SELF || @@ -158,7 +158,7 @@ int main(int argc, const char * argv[]) } if ((packetBytesWithoutLeadingChar = (currentBufferPos - startPointer))) { - agentList.getAgentSocket().send((sockaddr *)&agentPublicAddress, + agentList->getAgentSocket().send((sockaddr *)&agentPublicAddress, broadcastPacket, packetBytesWithoutLeadingChar + 1); } diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 50dda5a84e..062be90162 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -80,7 +80,6 @@ using namespace std; -AgentList agentList(AGENT_TYPE_INTERFACE); pthread_t networkReceiveThread; bool stopNetworkReceiveThread = false; @@ -465,7 +464,7 @@ void simulateHead(float frametime) int broadcastBytes = myAvatar.getBroadcastData(broadcastString); const char broadcastReceivers[2] = {AGENT_TYPE_VOXEL, AGENT_TYPE_AVATAR_MIXER}; - agentList.broadcastToAgents(broadcastString, broadcastBytes, broadcastReceivers, 2); + AgentList::getInstance()->broadcastToAgents(broadcastString, broadcastBytes, broadcastReceivers, 2); // If I'm in paint mode, send a voxel out to VOXEL server agents. if (::paintOn) { @@ -485,7 +484,7 @@ void simulateHead(float frametime) ::paintingVoxel.z >= 0.0 && ::paintingVoxel.z <= 1.0) { if (createVoxelEditMessage(PACKET_HEADER_SET_VOXEL, 0, 1, &::paintingVoxel, bufferOut, sizeOut)){ - agentList.broadcastToAgents((char*)bufferOut, sizeOut, &AGENT_TYPE_VOXEL, 1); + AgentList::getInstance()->broadcastToAgents((char*)bufferOut, sizeOut, &AGENT_TYPE_VOXEL, 1); delete bufferOut; } } @@ -827,7 +826,10 @@ void display(void) if (displayField) field.render(); // Render avatars of other agents - for(std::vector::iterator agent = agentList.getAgents().begin(); agent != agentList.getAgents().end(); agent++) + AgentList *agentList = AgentList::getInstance(); + for(std::vector::iterator agent = agentList->getAgents().begin(); + agent != agentList->getAgents().end(); + agent++) { if (agent->getLinkedData() != NULL) { @@ -906,7 +908,7 @@ void display(void) // Draw number of nearby people always glPointSize(1.0f); char agents[100]; - sprintf(agents, "Agents: %ld\n", agentList.getAgents().size()); + sprintf(agents, "Agents: %ld\n", AgentList::getInstance()->getAgents().size()); drawtext(WIDTH-100,20, 0.10, 0, 1.0, 0, agents, 1, 0, 0); if (::paintOn) { @@ -1007,14 +1009,14 @@ void sendVoxelServerEraseAll() { char message[100]; sprintf(message,"%c%s",'Z',"erase all"); int messageSize = strlen(message) + 1; - ::agentList.broadcastToAgents(message, messageSize, &AGENT_TYPE_VOXEL, 1); + AgentList::getInstance()->broadcastToAgents(message, messageSize, &AGENT_TYPE_VOXEL, 1); } void sendVoxelServerAddScene() { char message[100]; sprintf(message,"%c%s",'Z',"add scene"); int messageSize = strlen(message) + 1; - ::agentList.broadcastToAgents(message, messageSize, &AGENT_TYPE_VOXEL, 1); + AgentList::getInstance()->broadcastToAgents(message, messageSize, &AGENT_TYPE_VOXEL, 1); } void shiftPaintingColor() @@ -1198,7 +1200,7 @@ void *networkReceive(void *args) char *incomingPacket = new char[MAX_PACKET_SIZE]; while (!stopNetworkReceiveThread) { - if (agentList.getAgentSocket().receive(&senderAddress, incomingPacket, &bytesReceived)) { + if (AgentList::getInstance()->getAgentSocket().receive(&senderAddress, incomingPacket, &bytesReceived)) { packetCount++; bytesCount += bytesReceived; @@ -1212,10 +1214,10 @@ void *networkReceive(void *args) voxels.parseData(incomingPacket, bytesReceived); break; case PACKET_HEADER_BULK_AVATAR_DATA: - agentList.processBulkAgentData(&senderAddress, incomingPacket, bytesReceived, sizeof(float) * 11); + AgentList::getInstance()->processBulkAgentData(&senderAddress, incomingPacket, bytesReceived, sizeof(float) * 11); break; default: - agentList.processAgentData(&senderAddress, incomingPacket, bytesReceived); + AgentList::getInstance()->processAgentData(&senderAddress, incomingPacket, bytesReceived); break; } } @@ -1361,10 +1363,10 @@ void audioMixerUpdate(in_addr_t newMixerAddress, in_port_t newMixerPort) { } #endif - - int main(int argc, const char * argv[]) { + AgentList::createInstance(AGENT_TYPE_INTERFACE); + const char* domainIP = getCmdOption(argc, argv, "--domain"); if (domainIP) { strcpy(DOMAIN_IP,domainIP); @@ -1376,12 +1378,12 @@ int main(int argc, const char * argv[]) int ip = getLocalAddress(); sprintf(DOMAIN_IP,"%d.%d.%d.%d", (ip & 0xFF), ((ip >> 8) & 0xFF),((ip >> 16) & 0xFF), ((ip >> 24) & 0xFF)); } - + // the callback for our instance of AgentList is attachNewHeadToAgent - agentList.linkedDataCreateCallback = &attachNewHeadToAgent; + AgentList::getInstance()->linkedDataCreateCallback = &attachNewHeadToAgent; #ifndef _WIN32 - agentList.audioMixerSocketUpdate = &audioMixerUpdate; + AgentList::getInstance()->audioMixerSocketUpdate = &audioMixerUpdate; #endif #ifdef _WIN32 @@ -1390,9 +1392,9 @@ int main(int argc, const char * argv[]) #endif // start the agentList threads - agentList.startSilentAgentRemovalThread(); - agentList.startDomainServerCheckInThread(); - agentList.startPingUnknownAgentsThread(); + AgentList::getInstance()->startSilentAgentRemovalThread(); + AgentList::getInstance()->startDomainServerCheckInThread(); + AgentList::getInstance()->startPingUnknownAgentsThread(); glutInit(&argc, (char**)argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); diff --git a/mixer/src/main.cpp b/mixer/src/main.cpp index ed455166d8..9f77bbc9bb 100644 --- a/mixer/src/main.cpp +++ b/mixer/src/main.cpp @@ -61,7 +61,6 @@ const int AGENT_LOOPBACK_MODIFIER = 307; const int LOOPBACK_SANITY_CHECK = 0; -AgentList agentList(AGENT_TYPE_AUDIO_MIXER, MIXER_LISTEN_PORT); StDev stdev; void plateauAdditionOfSamples(int16_t &mixSample, int16_t sampleToAdd) { @@ -79,13 +78,15 @@ void *sendBuffer(void *args) int nextFrame = 0; timeval startTime; + AgentList *agentList = AgentList::getInstance(); + gettimeofday(&startTime, NULL); while (true) { sentBytes = 0; - for (int i = 0; i < agentList.getAgents().size(); i++) { - AudioRingBuffer *agentBuffer = (AudioRingBuffer *) agentList.getAgents()[i].getLinkedData(); + for (int i = 0; i < agentList->getAgents().size(); i++) { + AudioRingBuffer *agentBuffer = (AudioRingBuffer *) agentList->getAgents()[i].getLinkedData(); if (agentBuffer != NULL && agentBuffer->getEndOfLastWrite() != NULL) { @@ -103,12 +104,12 @@ void *sendBuffer(void *args) } } - int numAgents = agentList.getAgents().size(); + int numAgents = agentList->getAgents().size(); float distanceCoeffs[numAgents][numAgents]; memset(distanceCoeffs, 0, sizeof(distanceCoeffs)); - for (int i = 0; i < agentList.getAgents().size(); i++) { - Agent *agent = &agentList.getAgents()[i]; + for (int i = 0; i < agentList->getAgents().size(); i++) { + Agent *agent = &agentList->getAgents()[i]; AudioRingBuffer *agentRingBuffer = (AudioRingBuffer *) agent->getLinkedData(); float agentBearing = agentRingBuffer->getBearing(); @@ -119,15 +120,17 @@ void *sendBuffer(void *args) agentWantsLoopback = true; // correct the bearing - agentBearing = agentBearing > 0 ? agentBearing - AGENT_LOOPBACK_MODIFIER : agentBearing + AGENT_LOOPBACK_MODIFIER; + agentBearing = agentBearing > 0 + ? agentBearing - AGENT_LOOPBACK_MODIFIER + : agentBearing + AGENT_LOOPBACK_MODIFIER; } int16_t clientMix[BUFFER_LENGTH_SAMPLES_PER_CHANNEL * 2] = {}; - for (int j = 0; j < agentList.getAgents().size(); j++) { + for (int j = 0; j < agentList->getAgents().size(); j++) { if (i != j || ( i == j && agentWantsLoopback)) { - AudioRingBuffer *otherAgentBuffer = (AudioRingBuffer *)agentList.getAgents()[j].getLinkedData(); + AudioRingBuffer *otherAgentBuffer = (AudioRingBuffer *)agentList->getAgents()[j].getLinkedData(); float *agentPosition = agentRingBuffer->getPosition(); float *otherAgentPosition = otherAgentBuffer->getPosition(); @@ -143,12 +146,15 @@ void *sendBuffer(void *args) powf(agentPosition[1] - otherAgentPosition[1], 2) + powf(agentPosition[2] - otherAgentPosition[2], 2)); - distanceCoeffs[lowAgentIndex][highAgentIndex] = std::min(1.0f, powf(0.5, (logf(DISTANCE_RATIO * distanceToAgent) / logf(3)) - 1)); + float minCoefficient = std::min(1.0f, + powf(0.5, (logf(DISTANCE_RATIO * distanceToAgent) / logf(3)) - 1)); + distanceCoeffs[lowAgentIndex][highAgentIndex] = minCoefficient; } // get the angle from the right-angle triangle - float triangleAngle = atan2f(fabsf(agentPosition[2] - otherAgentPosition[2]), fabsf(agentPosition[0] - otherAgentPosition[0])) * (180 / M_PI); + float triangleAngle = atan2f(fabsf(agentPosition[2] - otherAgentPosition[2]), + fabsf(agentPosition[0] - otherAgentPosition[0])) * (180 / M_PI); float angleToSource; @@ -214,11 +220,11 @@ void *sendBuffer(void *args) } } - agentList.getAgentSocket().send(agent->getPublicSocket(), clientMix, BUFFER_LENGTH_BYTES); + agentList->getAgentSocket().send(agent->getPublicSocket(), clientMix, BUFFER_LENGTH_BYTES); } - for (int i = 0; i < agentList.getAgents().size(); i++) { - AudioRingBuffer *agentBuffer = (AudioRingBuffer *)agentList.getAgents()[i].getLinkedData(); + for (int i = 0; i < agentList->getAgents().size(); i++) { + AudioRingBuffer *agentBuffer = (AudioRingBuffer *)agentList->getAgents()[i].getLinkedData(); if (agentBuffer->wasAddedToMix()) { agentBuffer->setNextOutput(agentBuffer->getNextOutput() + BUFFER_LENGTH_SAMPLES_PER_CHANNEL); @@ -250,14 +256,15 @@ void attachNewBufferToAgent(Agent *newAgent) { int main(int argc, const char * argv[]) { + AgentList *agentList = AgentList::createInstance(AGENT_TYPE_AUDIO_MIXER, MIXER_LISTEN_PORT); setvbuf(stdout, NULL, _IOLBF, 0); ssize_t receivedBytes = 0; - agentList.linkedDataCreateCallback = attachNewBufferToAgent; + agentList->linkedDataCreateCallback = attachNewBufferToAgent; - agentList.startSilentAgentRemovalThread(); - agentList.startDomainServerCheckInThread(); + agentList->startSilentAgentRemovalThread(); + agentList->startDomainServerCheckInThread(); unsigned char *packetData = new unsigned char[MAX_PACKET_SIZE]; @@ -276,7 +283,7 @@ int main(int argc, const char * argv[]) bool firstSample = true; while (true) { - if(agentList.getAgentSocket().receive(agentAddress, packetData, &receivedBytes)) { + if(agentList->getAgentSocket().receive(agentAddress, packetData, &receivedBytes)) { if (packetData[0] == PACKET_HEADER_INJECT_AUDIO) { // Compute and report standard deviation for jitter calculation @@ -298,14 +305,14 @@ int main(int argc, const char * argv[]) // add or update the existing interface agent if (!LOOPBACK_SANITY_CHECK) { - if (agentList.addOrUpdateAgent(agentAddress, agentAddress, packetData[0], agentList.getLastAgentId())) { - agentList.increaseAgentId(); + if (agentList->addOrUpdateAgent(agentAddress, agentAddress, packetData[0], agentList->getLastAgentId())) { + agentList->increaseAgentId(); } - agentList.updateAgentWithData(agentAddress, (void *)packetData, receivedBytes); + agentList->updateAgentWithData(agentAddress, (void *)packetData, receivedBytes); } else { memcpy(loopbackAudioPacket, packetData + 1 + (sizeof(float) * 4), 1024); - agentList.getAgentSocket().send(agentAddress, loopbackAudioPacket, 1024); + agentList->getAgentSocket().send(agentAddress, loopbackAudioPacket, 1024); } } } diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index b2cc6a3ae2..cfcfc36ec8 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -31,16 +31,27 @@ bool domainServerCheckinStopFlag = false; bool pingUnknownAgentThreadStopFlag = false; pthread_mutex_t vectorChangeMutex = PTHREAD_MUTEX_INITIALIZER; -int unpackAgentId(unsigned char *packedData, uint16_t *agentId) { - memcpy(packedData, agentId, sizeof(uint16_t)); - return sizeof(uint16_t); +AgentList* AgentList::_sharedInstance = NULL; + +AgentList* AgentList::createInstance(char ownerType, unsigned int socketListenPort) { + if (_sharedInstance == NULL) { + _sharedInstance = new AgentList(ownerType, socketListenPort); + } else { + printf("AgentList createInstance called with existing instance.\n"); + } + + return _sharedInstance; } -int packAgentId(unsigned char *packStore, uint16_t agentId) { - memcpy(&agentId, packStore, sizeof(uint16_t)); - return sizeof(uint16_t); +AgentList* AgentList::getInstance() { + if (_sharedInstance == NULL) { + printf("AgentList getInstance called before call to createInstance. Returning NULL pointer.\n"); + } + + return _sharedInstance; } + AgentList::AgentList(char newOwnerType, unsigned int newSocketListenPort) : agentSocket(newSocketListenPort) { ownerType = newOwnerType; socketListenPort = newSocketListenPort; @@ -414,3 +425,13 @@ void AgentList::stopDomainServerCheckInThread() { domainServerCheckinStopFlag = true; pthread_join(checkInWithDomainServerThread, NULL); } + +int unpackAgentId(unsigned char *packedData, uint16_t *agentId) { + memcpy(packedData, agentId, sizeof(uint16_t)); + return sizeof(uint16_t); +} + +int packAgentId(unsigned char *packStore, uint16_t agentId) { + memcpy(&agentId, packStore, sizeof(uint16_t)); + return sizeof(uint16_t); +} diff --git a/shared/src/AgentList.h b/shared/src/AgentList.h index ee61a35c8d..454d02ea1a 100644 --- a/shared/src/AgentList.h +++ b/shared/src/AgentList.h @@ -29,20 +29,9 @@ extern char DOMAIN_IP[100]; // IP Address will be re-set by lookup on startu extern const int DOMAINSERVER_PORT; class AgentList { - - UDPSocket agentSocket; - char ownerType; - unsigned int socketListenPort; - std::vector agents; - uint16_t lastAgentId; - pthread_t removeSilentAgentsThread; - pthread_t checkInWithDomainServerThread; - pthread_t pingUnknownAgentsThread; - - void handlePingReply(sockaddr *agentAddress); public: - AgentList(char ownerType, unsigned int socketListenPort = AGENT_SOCKET_LISTEN_PORT); - ~AgentList(); + static AgentList* createInstance(char ownerType, unsigned int socketListenPort = AGENT_SOCKET_LISTEN_PORT); + static AgentList* getInstance(); void(*linkedDataCreateCallback)(Agent *); void(*audioMixerSocketUpdate)(in_addr_t, in_port_t); @@ -76,6 +65,24 @@ public: void stopDomainServerCheckInThread(); void startPingUnknownAgentsThread(); void stopPingUnknownAgentsThread(); +private: + static AgentList* _sharedInstance; + + AgentList(char ownerType, unsigned int socketListenPort); + ~AgentList(); + AgentList(AgentList const&); // Don't implement, needed to avoid copies of singleton + void operator=(AgentList const&); // Don't implement, needed to avoid copies of singleton + + UDPSocket agentSocket; + char ownerType; + unsigned int socketListenPort; + std::vector agents; + uint16_t lastAgentId; + pthread_t removeSilentAgentsThread; + pthread_t checkInWithDomainServerThread; + pthread_t pingUnknownAgentsThread; + + void handlePingReply(sockaddr *agentAddress); }; int unpackAgentId(unsigned char *packedData, uint16_t *agentId); diff --git a/voxel/src/main.cpp b/voxel/src/main.cpp index da86c189c3..c3ab221b01 100644 --- a/voxel/src/main.cpp +++ b/voxel/src/main.cpp @@ -46,7 +46,6 @@ const int PACKETS_PER_CLIENT_PER_INTERVAL = 2; const int MAX_VOXEL_TREE_DEPTH_LEVELS = 4; -AgentList agentList(AGENT_TYPE_VOXEL, VOXEL_LISTEN_PORT); VoxelTree randomTree; bool wantColorRandomizer = false; @@ -122,11 +121,11 @@ void eraseVoxelTreeAndCleanupAgentVisitData() { ::randomTree.eraseAllVoxels(); // enumerate the agents clean up their marker nodes - for (int i = 0; i < agentList.getAgents().size(); i++) { + for (int i = 0; i < AgentList::getInstance()->getAgents().size(); i++) { //printf("eraseVoxelTreeAndCleanupAgentVisitData() agent[%d]\n",i); - - Agent *thisAgent = (Agent *)&::agentList.getAgents()[i]; + + Agent *thisAgent = (Agent *)&AgentList::getInstance()->getAgents()[i]; VoxelAgentData *agentData = (VoxelAgentData *)(thisAgent->getLinkedData()); // lock this agent's delete mutex so that the delete thread doesn't @@ -145,6 +144,7 @@ void eraseVoxelTreeAndCleanupAgentVisitData() { void *distributeVoxelsToListeners(void *args) { + AgentList *agentList = AgentList::getInstance(); timeval lastSendTime; unsigned char *stopOctal; @@ -161,9 +161,9 @@ void *distributeVoxelsToListeners(void *args) { gettimeofday(&lastSendTime, NULL); // enumerate the agents to send 3 packets to each - for (int i = 0; i < agentList.getAgents().size(); i++) { + for (int i = 0; i < agentList->getAgents().size(); i++) { - Agent *thisAgent = (Agent *)&agentList.getAgents()[i]; + Agent *thisAgent = (Agent *)&agentList->getAgents()[i]; VoxelAgentData *agentData = (VoxelAgentData *)(thisAgent->getLinkedData()); // lock this agent's delete mutex so that the delete thread doesn't @@ -184,7 +184,7 @@ void *distributeVoxelsToListeners(void *args) { treeRoot, stopOctal); - agentList.getAgentSocket().send(thisAgent->getActiveSocket(), voxelPacket, voxelPacketEnd - voxelPacket); + agentList->getAgentSocket().send(thisAgent->getActiveSocket(), voxelPacket, voxelPacketEnd - voxelPacket); packetCount++; totalBytesSent += voxelPacketEnd - voxelPacket; @@ -233,6 +233,7 @@ void attachVoxelAgentDataToAgent(Agent *newAgent) { int main(int argc, const char * argv[]) { + AgentList *agentList = AgentList::createInstance(AGENT_TYPE_VOXEL, VOXEL_LISTEN_PORT); setvbuf(stdout, NULL, _IOLBF, 0); // Handle Local Domain testing with the --local command line @@ -244,9 +245,9 @@ int main(int argc, const char * argv[]) sprintf(DOMAIN_IP,"%d.%d.%d.%d", (ip & 0xFF), ((ip >> 8) & 0xFF),((ip >> 16) & 0xFF), ((ip >> 24) & 0xFF)); } - agentList.linkedDataCreateCallback = &attachVoxelAgentDataToAgent; - agentList.startSilentAgentRemovalThread(); - agentList.startDomainServerCheckInThread(); + agentList->linkedDataCreateCallback = &attachVoxelAgentDataToAgent; + agentList->startSilentAgentRemovalThread(); + agentList->startDomainServerCheckInThread(); srand((unsigned)time(0)); @@ -294,7 +295,7 @@ int main(int argc, const char * argv[]) // loop to send to agents requesting data while (true) { - if (agentList.getAgentSocket().receive(&agentPublicAddress, packetData, &receivedBytes)) { + if (agentList->getAgentSocket().receive(&agentPublicAddress, packetData, &receivedBytes)) { // XXXBHG: Hacked in support for 'S' SET command if (packetData[0] == PACKET_HEADER_SET_VOXEL) { unsigned short int itemNumber = (*((unsigned short int*)&packetData[1])); @@ -345,7 +346,7 @@ int main(int argc, const char * argv[]) // Now send this to the connected agents so they know to delete printf("rebroadcasting delete voxel message to connected agents... agentList.broadcastToAgents()\n"); - agentList.broadcastToAgents(packetData,receivedBytes, &AGENT_TYPE_INTERFACE, 1); + agentList->broadcastToAgents(packetData,receivedBytes, &AGENT_TYPE_INTERFACE, 1); } if (packetData[0] == PACKET_HEADER_Z_COMMAND) { @@ -373,19 +374,19 @@ int main(int argc, const char * argv[]) // Now send this to the connected agents so they can also process these messages printf("rebroadcasting Z message to connected agents... agentList.broadcastToAgents()\n"); - agentList.broadcastToAgents(packetData,receivedBytes, &AGENT_TYPE_INTERFACE, 1); + agentList->broadcastToAgents(packetData,receivedBytes, &AGENT_TYPE_INTERFACE, 1); } // If we got a PACKET_HEADER_HEAD_DATA, then we're talking to an AGENT_TYPE_INTERFACE, and we // need to make sure we have it in our agentList. if (packetData[0] == PACKET_HEADER_HEAD_DATA) { - if (agentList.addOrUpdateAgent(&agentPublicAddress, + if (agentList->addOrUpdateAgent(&agentPublicAddress, &agentPublicAddress, AGENT_TYPE_INTERFACE, - agentList.getLastAgentId())) { - agentList.increaseAgentId(); + agentList->getLastAgentId())) { + agentList->increaseAgentId(); } - agentList.updateAgentWithData(&agentPublicAddress, (void *)packetData, receivedBytes); + agentList->updateAgentWithData(&agentPublicAddress, (void *)packetData, receivedBytes); } } }