summaryrefslogtreecommitdiff
path: root/implementation/endpoints/src/endpoint_manager_impl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'implementation/endpoints/src/endpoint_manager_impl.cpp')
-rw-r--r--implementation/endpoints/src/endpoint_manager_impl.cpp55
1 files changed, 31 insertions, 24 deletions
diff --git a/implementation/endpoints/src/endpoint_manager_impl.cpp b/implementation/endpoints/src/endpoint_manager_impl.cpp
index d4fedd4..dc02aa5 100644
--- a/implementation/endpoints/src/endpoint_manager_impl.cpp
+++ b/implementation/endpoints/src/endpoint_manager_impl.cpp
@@ -412,35 +412,42 @@ void endpoint_manager_impl::find_or_create_multicast_endpoint(
}
void endpoint_manager_impl::clear_multicast_endpoints(service_t _service, instance_t _instance) {
- std::lock_guard<std::recursive_mutex> its_lock(endpoint_mutex_);
- // Clear multicast info and endpoint and multicast instance (remote service)
- if (multicast_info.find(_service) != multicast_info.end()) {
- if (multicast_info[_service].find(_instance) != multicast_info[_service].end()) {
- std::string address = multicast_info[_service][_instance]->get_address().to_string();
- uint16_t port = multicast_info[_service][_instance]->get_port();
- std::shared_ptr<endpoint> multicast_endpoint;
- auto found_port = server_endpoints_.find(port);
- if (found_port != server_endpoints_.end()) {
- auto found_unreliable = found_port->second.find(false);
- if (found_unreliable != found_port->second.end()) {
- multicast_endpoint = found_unreliable->second;
- dynamic_cast<udp_server_endpoint_impl*>(
- multicast_endpoint.get())->leave(address);
- multicast_endpoint->stop();
- server_endpoints_[port].erase(false);
+
+ std::shared_ptr<endpoint> multicast_endpoint;
+ std::string address;
+
+ {
+ std::lock_guard<std::recursive_mutex> its_lock(endpoint_mutex_);
+ // Clear multicast info and endpoint and multicast instance (remote service)
+ if (multicast_info.find(_service) != multicast_info.end()) {
+ if (multicast_info[_service].find(_instance) != multicast_info[_service].end()) {
+ address = multicast_info[_service][_instance]->get_address().to_string();
+ uint16_t port = multicast_info[_service][_instance]->get_port();
+ auto found_port = server_endpoints_.find(port);
+ if (found_port != server_endpoints_.end()) {
+ auto found_unreliable = found_port->second.find(false);
+ if (found_unreliable != found_port->second.end()) {
+ multicast_endpoint = found_unreliable->second;
+ server_endpoints_[port].erase(false);
+ }
+ if (found_port->second.find(true) == found_port->second.end()) {
+ server_endpoints_.erase(port);
+ }
}
- if (found_port->second.find(true) == found_port->second.end()) {
- server_endpoints_.erase(port);
+ multicast_info[_service].erase(_instance);
+ if (0 >= multicast_info[_service].size()) {
+ multicast_info.erase(_service);
}
+ // Clear service_instances_ for multicast endpoint
+ (void)remove_instance(_service, multicast_endpoint.get());
}
- multicast_info[_service].erase(_instance);
- if (0 >= multicast_info[_service].size()) {
- multicast_info.erase(_service);
- }
- // Clear service_instances_ for multicast endpoint
- remove_instance(_service, multicast_endpoint.get());
}
}
+ if (multicast_endpoint) {
+ dynamic_cast<udp_server_endpoint_impl*>(
+ multicast_endpoint.get())->leave(address);
+ multicast_endpoint->stop();
+ }
}
bool endpoint_manager_impl::supports_selective(service_t _service,