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

Method on_availability

implementation/runtime/src/application_impl.cpp:1411–1524  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1409}
1410
1411void application_impl::on_availability(service_t _service, instance_t _instance, availability_state_e _state, major_version_t _major,
1412 minor_version_t _minor) {
1413
1414 std::vector<availability_state_handler_t> its_handlers;
1415 {
1416 std::scoped_lock availability_lock{availability_mutex_};
1417 if (_state == is_available_unlocked(_service, _instance, _major, _minor)) {
1418 return;
1419 }
1420
1421 if (_state != availability_state_e::AS_UNAVAILABLE) {
1422 available_[_service][_instance][_major] = std::make_pair(_minor, _state);
1423 } else {
1424 auto found_available_service = available_.find(_service);
1425 if (found_available_service != available_.end()) {
1426 auto found_instance = found_available_service->second.find(_instance);
1427 if (found_instance != found_available_service->second.end()) {
1428 auto found_major = found_instance->second.find(_major);
1429 if (found_major != found_instance->second.end()) {
1430 if (_minor == found_major->second.first)
1431 found_available_service->second.erase(_instance);
1432 }
1433 }
1434 }
1435 }
1436
1437 auto find_matching_handler = [&](availability_major_minor_t& _av_ma_mi_it) {
1438 auto found_major = _av_ma_mi_it.find(_major);
1439 if (found_major != _av_ma_mi_it.end()) {
1440 for (std::int32_t mi = static_cast<std::int32_t>(_minor); mi >= 0; mi--) {
1441 auto found_minor = found_major->second.find(static_cast<minor_version_t>(mi));
1442 if (found_minor != found_major->second.end()) {
1443 if (get_availability_state(found_minor->second.second, _service, _instance, _major, _minor) != _state) {
1444 its_handlers.push_back(found_minor->second.first);
1445 set_availability_state(found_minor->second.second, _service, _instance, _major, _minor, _state);
1446 }
1447 }
1448 }
1449 auto found_any_minor = found_major->second.find(ANY_MINOR);
1450 if (found_any_minor != found_major->second.end()) {
1451 if (get_availability_state(found_any_minor->second.second, _service, _instance, _major, _minor) != _state) {
1452 its_handlers.push_back(found_any_minor->second.first);
1453 set_availability_state(found_any_minor->second.second, _service, _instance, _major, _minor, _state);
1454 }
1455 }
1456 }
1457 found_major = _av_ma_mi_it.find(ANY_MAJOR);
1458 if (found_major != _av_ma_mi_it.end()) {
1459 for (std::int32_t mi = static_cast<std::int32_t>(_minor); mi >= 0; mi--) {
1460 auto found_minor = found_major->second.find(static_cast<minor_version_t>(mi));
1461 if (found_minor != found_major->second.end()) {
1462 if (get_availability_state(found_minor->second.second, _service, _instance, _major, _minor) != _state) {
1463 its_handlers.push_back(found_minor->second.first);
1464 set_availability_state(found_minor->second.second, _service, _instance, _major, _minor, _state);
1465 }
1466 }
1467 }
1468 auto found_any_minor = found_major->second.find(ANY_MINOR);

Callers 2

on_routing_infoMethod · 0.45
on_stop_offer_serviceMethod · 0.45

Calls 2

endMethod · 0.80
sizeMethod · 0.45

Tested by

no test coverage detected