MCPcopy Create free account
hub / github.com/COVESA/vsomeip / release_service

Method release_service

implementation/routing/src/routing_manager_impl.cpp:462–524  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

460}
461
462void routing_manager_impl::release_service(client_t _client, service_t _service, instance_t _instance) {
463
464 VSOMEIP_INFO << "RELEASE(" << hex4(_client) << "): [" << hex4(_service) << "." << hex4(_instance) << "]";
465
466 routing_manager_base::release_service(_client, _service, _instance);
467 remove_requested_service(_client, _service, _instance, ANY_MAJOR, ANY_MINOR);
468 remove_pending_requests(pending_request_removal_type_e::REQUESTING_ONLY, _client, _service, _instance);
469
470 std::shared_ptr<serviceinfo> its_info(find_service(_service, _instance));
471 if (its_info && !its_info->is_local()) {
472 if (0 == its_info->get_requesters_size()) {
473 auto its_eventgroups = find_eventgroups(_service, _instance);
474 for (const auto& eg : its_eventgroups) {
475 auto its_events = eg->get_events();
476 for (auto& e : its_events) {
477 e->clear_subscribers();
478 }
479 }
480
481 if (discovery_) {
482 discovery_->release_service(_service, _instance);
483 discovery_->unsubscribe_all(_service, _instance);
484 }
485 ep_mgr_impl_->clear_client_endpoints(_service, _instance, true);
486 ep_mgr_impl_->clear_client_endpoints(_service, _instance, false);
487 its_info->set_endpoint(nullptr, true);
488 its_info->set_endpoint(nullptr, false);
489 unset_all_eventpayloads(_service, _instance);
490 } else {
491 auto its_eventgroups = find_eventgroups(_service, _instance);
492 for (const auto& eg : its_eventgroups) {
493 auto its_id = eg->get_eventgroup();
494 auto its_events = eg->get_events();
495 bool eg_has_subscribers{false};
496 for (const auto& e : its_events) {
497 e->remove_subscriber(its_id, _client);
498 if (!e->get_subscribers().empty()) {
499 eg_has_subscribers = true;
500 }
501 }
502 if (discovery_) {
503 discovery_->unsubscribe(_service, _instance, its_id, _client);
504 }
505 if (!eg_has_subscribers) {
506 for (const auto& e : its_events) {
507 if (e->is_set()) {
508 VSOMEIP_INFO_P << "Unsetting payload for [" << hex4(_service) << "." << hex4(_instance) << "."
509 << hex4(e->get_event()) << "]";
510 }
511 e->unset_payload(true);
512 }
513 }
514 }
515 }
516 } else {
517 if (discovery_) {
518 // Release the service only if there are no more requesters.
519 if (!has_requester(_service, _instance, ANY_MAJOR, ANY_MINOR)) {

Callers

nothing calls this directly

Calls 15

hex4Function · 0.85
get_requesters_sizeMethod · 0.80
get_eventsMethod · 0.80
clear_subscribersMethod · 0.80
remove_subscriberMethod · 0.80
get_subscribersMethod · 0.80
is_setMethod · 0.80
unset_payloadMethod · 0.80
is_localMethod · 0.45
unsubscribe_allMethod · 0.45
set_endpointMethod · 0.45

Tested by

no test coverage detected