int Locator_Repository::unregister_if_address_reused (const ACE_CString& fqname, const char* partial_ior, ImR_Locator_i* imr_locator) { if (this->opts_.debug() > 0) { ORBSVCS_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t)ImR: checking reuse address ") ACE_TEXT ("for server \"%C\" ior \"%C\"\n"), fqname.c_str(), partial_ior)); } ACE_CString key; Server_Info_Ptr si; Server_Info::fqname_to_key (fqname.c_str(), key); servers ().find (key, si); ACE_CString poa_name; ACE_CString server_id; if (si.null()) { Server_Info::parse_id (fqname.c_str(), server_id, poa_name); } else { server_id = si->active_info ()->server_id; poa_name = si->active_info ()->poa_name; } Locator_Repository::SIMap::ENTRY* sientry = 0; Locator_Repository::SIMap::ITERATOR siit (servers ()); for (; siit.next (sientry); siit.advance() ) { Server_Info *info = sientry->int_id_->active_info (); if (this->opts_.debug() > 0) { ORBSVCS_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t)ImR: iterating - registered server") ACE_TEXT ("\"%C:%C\" key = <%C> ior \"%C\"\n"), info->server_id.c_str(), info->poa_name.c_str (), info->key_name_.c_str(), info->partial_ior.c_str ())); } bool same_server = info->server_id == server_id; if (same_server && (server_id.length () == 0)) { same_server = info->poa_name == poa_name; } if (info->partial_ior == partial_ior && !same_server) { if (this->opts_.debug() > 0) { ORBSVCS_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t)ImR: reuse address %C so remove server %C \n"), info->partial_ior.c_str (), info->poa_name.c_str ())); } imr_locator->pinger ().remove_server (info->key_name_.c_str()); AsyncAccessManager_ptr aam = imr_locator->find_aam (info->key_name_.c_str ()); if (!aam.is_nil()) { aam->server_is_shutting_down (); } info->reset_runtime (); } } return 0; }