| 591 | } |
| 592 | |
| 593 | void routing_manager_impl::unsubscribe(client_t _client, service_t _service, instance_t _instance, eventgroup_t _eventgroup, |
| 594 | event_t _event) { |
| 595 | |
| 596 | VSOMEIP_INFO << "UNSUBSCRIBE(" << hex4(_client) << "): [" << hex4(_service) << "." << hex4(_instance) << "." << hex4(_eventgroup) << "." |
| 597 | << hex4(_event) << "]"; |
| 598 | |
| 599 | bool last_subscriber_removed(true); |
| 600 | |
| 601 | std::shared_ptr<eventgroupinfo> its_info = find_eventgroup(_service, _instance, _eventgroup); |
| 602 | if (its_info) { |
| 603 | for (const auto& e : its_info->get_events()) { |
| 604 | if (e->get_event() == _event || ANY_EVENT == _event) |
| 605 | e->remove_subscriber(_eventgroup, _client); |
| 606 | } |
| 607 | for (const auto& e : its_info->get_events()) { |
| 608 | if (e->has_subscriber(_eventgroup, ANY_CLIENT)) { |
| 609 | last_subscriber_removed = false; |
| 610 | break; |
| 611 | } |
| 612 | } |
| 613 | } |
| 614 | |
| 615 | if (discovery_) { |
| 616 | if (auto its_local_client = find_local_client(_service, _instance); VSOMEIP_ROUTING_CLIENT == its_local_client) { |
| 617 | if (last_subscriber_removed) { |
| 618 | unset_all_eventpayloads(_service, _instance, _eventgroup); |
| 619 | { |
| 620 | auto tuple = std::make_tuple(_service, _instance, _eventgroup, _client); |
| 621 | std::scoped_lock its_lock{remote_subscription_state_mutex_}; |
| 622 | remote_subscription_state_.erase(tuple); |
| 623 | } |
| 624 | } |
| 625 | |
| 626 | if (its_info && (last_subscriber_removed || its_info->is_selective())) { |
| 627 | |
| 628 | discovery_->unsubscribe(_service, _instance, _eventgroup, its_info->is_selective() ? _client : VSOMEIP_ROUTING_CLIENT); |
| 629 | } |
| 630 | } |
| 631 | |
| 632 | if (last_subscriber_removed) { |
| 633 | ep_mgr_impl_->clear_multicast_endpoints(_service, _instance); |
| 634 | } |
| 635 | |
| 636 | } else { |
| 637 | VSOMEIP_ERROR << "SOME/IP eventgroups require SD to be enabled!"; |
| 638 | } |
| 639 | } |
| 640 | |
| 641 | bool routing_manager_impl::send_notification(client_t _client, std::shared_ptr<message> _message, bool _force) { |
| 642 | bool is_sent(false); |
no test coverage detected