mirror of
https://github.com/overte-org/overte.git
synced 2025-04-21 18:44:00 +02:00
don't delete an agent if the data is concurrently being used
This commit is contained in:
parent
de3f5edd69
commit
0fb244c2bd
2 changed files with 16 additions and 10 deletions
|
@ -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<Agent>::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++;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue