// Update void NDP::update(){ // update loop while(running){ // Removal list vector<string> removals; // Lock barrier.lock(); // Update neighbor table for(auto &n: neighbors){ // Arrived if(n.getArrived() == true){ // New neighbor if(n.getAge() == -1){ // Notify IARP barrier.unlock(); instance->foundNeighbor(n.getAddress()); barrier.lock(); } n.setAge(0); n.setArrived(false); } // Not arrived else{ // Neighbor lost if(n.getAge() >= maxAge){ // Add to removal list removals.push_back(n.getAddress()); } // Neighbor not lost yet else{ // Increment age n.setAge(n.getAge() + 1); } } } // Remove entries for(auto &a: removals){ // Remove neighbor removeNeighbor(a); // Notify IARP barrier.unlock(); instance->lostNeighbor(a); barrier.lock(); } // Unlock barrier.unlock(); // SLeep for random duration chrono::milliseconds dura( rand() % (updateMaxDelay - updateMinDelay) + updateMinDelay); this_thread::sleep_for(dura); } }
void Graph<T>::removeNeighbor( int nodeID, int neighborID ){ removeNeighbor( nodes[nodeID].neighbors, neighborID ); }