mirror of
https://github.com/AleziaKurdis/overte.git
synced 2025-04-16 02:19:38 +02:00
Merge pull request #27 from birarda/singleton
manage one AgentList per process via singleton
This commit is contained in:
commit
b3a811498a
7 changed files with 138 additions and 101 deletions
|
@ -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<Agent>::iterator avatarAgent = agentList.getAgents().begin();
|
||||
avatarAgent != agentList.getAgents().end();
|
||||
for (std::vector<Agent>::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;
|
||||
}
|
||||
|
|
|
@ -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<char, Agent *> 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<Agent>::iterator agent = agentList.getAgents().begin();
|
||||
agent != agentList.getAgents().end();
|
||||
for(std::vector<Agent>::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);
|
||||
}
|
||||
|
|
|
@ -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<Agent>::iterator agent = agentList.getAgents().begin(); agent != agentList.getAgents().end(); agent++) {
|
||||
AgentList *agentList = AgentList::getInstance();
|
||||
for(std::vector<Agent>::iterator agent = agentList->getAgents().begin();
|
||||
agent != agentList->getAgents().end();
|
||||
agent++) {
|
||||
if (agent->getLinkedData() != NULL) {
|
||||
Head *agentHead = (Head *)agent->getLinkedData();
|
||||
glPushMatrix();
|
||||
|
@ -903,7 +905,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) {
|
||||
|
@ -1004,14 +1006,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()
|
||||
|
@ -1194,7 +1196,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;
|
||||
|
||||
|
@ -1208,10 +1210,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;
|
||||
}
|
||||
}
|
||||
|
@ -1357,10 +1359,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);
|
||||
|
@ -1372,12 +1374,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
|
||||
|
@ -1386,9 +1388,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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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<Agent> 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<Agent> 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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue