From 0fb244c2bd13bd9ead8fc95fe4104608416adaa3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 28 Mar 2013 14:33:04 -0700 Subject: [PATCH] don't delete an agent if the data is concurrently being used --- shared/src/AgentList.cpp | 25 ++++++++++++++++--------- shared/src/AgentList.h | 1 - 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index 072bdc1079..d745d0a9c4 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -67,28 +67,24 @@ unsigned int AgentList::getSocketListenPort() { void AgentList::processAgentData(sockaddr *senderAddress, void *packetData, size_t dataBytes) { switch (((char *)packetData)[0]) { - case 'D': - { + case 'D': { // list of agents from domain server updateList((unsigned char *)packetData, dataBytes); break; } - case 'H': - { + case 'H': { // head data from another agent updateAgentWithData(senderAddress, packetData, dataBytes); break; } - case 'P': - { + case 'P': { // ping from another agent //std::cout << "Got ping from " << inet_ntoa(((sockaddr_in *)senderAddress)->sin_addr) << "\n"; char reply[] = "R"; agentSocket.send(senderAddress, reply, 1); break; } - case 'R': - { + case 'R': { // ping reply from another agent //std::cout << "Got ping reply from " << inet_ntoa(((sockaddr_in *)senderAddress)->sin_addr) << "\n"; handlePingReply(senderAddress); @@ -264,11 +260,22 @@ void *removeSilentAgents(void *args) { checkTimeUSecs = usecTimestampNow(); for(std::vector::iterator agent = agents->begin(); agent != agents->end();) { - if ((checkTimeUSecs - agent->getLastRecvTimeUsecs()) > AGENT_SILENCE_THRESHOLD_USECS && agent->getType() != 'V') { + + pthread_mutex_t * agentDeleteMutex = &agent->deleteMutex; + + if ((checkTimeUSecs - agent->getLastRecvTimeUsecs()) > AGENT_SILENCE_THRESHOLD_USECS && agent->getType() != 'V' + && pthread_mutex_trylock(agentDeleteMutex) == 0) { + std::cout << "Killing agent " << &(*agent) << "\n"; + + // make sure the vector isn't currently adding an agent pthread_mutex_lock(&vectorChangeMutex); agent = agents->erase(agent); pthread_mutex_unlock(&vectorChangeMutex); + + // release the delete mutex and destroy it + pthread_mutex_unlock(agentDeleteMutex); + pthread_mutex_destroy(agentDeleteMutex); } else { agent++; } diff --git a/shared/src/AgentList.h b/shared/src/AgentList.h index 4e313a2e4a..34a927b1fc 100644 --- a/shared/src/AgentList.h +++ b/shared/src/AgentList.h @@ -57,7 +57,6 @@ public: void processAgentData(sockaddr *senderAddress, void *packetData, size_t dataBytes); void updateAgentWithData(sockaddr *senderAddress, void *packetData, size_t dataBytes); void broadcastToAgents(char *broadcastData, size_t dataBytes); - void sendToAgent(Agent *destAgent, void *packetData, size_t dataBytes); void pingAgents(); char getOwnerType(); unsigned int getSocketListenPort();