Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 18 additions & 13 deletions implementation/routing/src/routing_manager_base.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -547,32 +547,37 @@ void routing_manager_base::register_event(client_t _client, service_t _service,

void routing_manager_base::unregister_event(client_t _client, service_t _service, instance_t _instance, event_t _event, bool _is_provided) {
(void)_client;
std::shared_ptr<event> its_unrefed_event;
std::shared_ptr<event> its_event;
bool event_ref_cleared{false};
{
std::lock_guard<std::mutex> its_lock(events_mutex_);
const auto search = events_.find(service_instance_t{_service, _instance});
if (search != events_.end()) {
const auto found_event = search->second.find(_event);
if (found_event != search->second.end()) {
auto its_event = found_event->second;
its_event = found_event->second;
its_event->remove_ref(_client, _is_provided);
if (!its_event->has_ref()) {
its_unrefed_event = its_event;
event_ref_cleared = true;
search->second.erase(found_event);
} else if (_is_provided) {
its_event->set_provided(false);
}
}
}
}
if (its_unrefed_event) {
auto its_eventgroups = its_unrefed_event->get_eventgroups();
for (auto eg : its_eventgroups) {
std::shared_ptr<eventgroupinfo> its_eventgroup_info = find_eventgroup(_service, _instance, eg);
if (its_eventgroup_info) {
its_eventgroup_info->remove_event(its_unrefed_event);
if (0 == its_eventgroup_info->get_events().size()) {
remove_eventgroup_info(_service, _instance, eg);
if (its_event) {
if (_is_provided) {
its_event->unset_payload(false);
its_event->set_provided(false);
}
if (event_ref_cleared) {
auto its_eventgroups = its_event->get_eventgroups();
for (auto eg : its_eventgroups) {
std::shared_ptr<eventgroupinfo> its_eventgroup_info = find_eventgroup(_service, _instance, eg);
if (its_eventgroup_info) {
its_eventgroup_info->remove_event(its_event);
if (0 == its_eventgroup_info->get_events().size()) {
remove_eventgroup_info(_service, _instance, eg);
}
}
}
}
Expand Down
Loading