| 1409 | } |
| 1410 | |
| 1411 | void 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); |
no test coverage detected