From 85677c8f43f40aa8d22f5f010524ca4417f22c49 Mon Sep 17 00:00:00 2001 From: hjkcst <2693958665@qq.com> Date: Thu, 22 May 2025 18:04:59 +0800 Subject: [PATCH 1/2] When testing a cycle event, calling application_impl::stop_offer_event is invalid. If an app offers an event that is configured as cyclic, and after notifying, it calls stop_offer_event, the event keeps running the notifying cycle, which can be seen by adding a log to `event::notify` This stops that cycle. Signed-off-by: hjkcst <2693958665@qq.com> --- .../routing/src/routing_manager_base.cpp | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/implementation/routing/src/routing_manager_base.cpp b/implementation/routing/src/routing_manager_base.cpp index 6b3c5d0b5..1304b65dc 100644 --- a/implementation/routing/src/routing_manager_base.cpp +++ b/implementation/routing/src/routing_manager_base.cpp @@ -547,32 +547,38 @@ 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 its_unrefed_event; + std::shared_ptr its_event; + bool event_ref_cleared {false}; { std::lock_guard 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 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 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); + } } } } From f7ef9b75eb220370dad1e21880133d8f71c4db24 Mon Sep 17 00:00:00 2001 From: Duarte Fonseca Date: Tue, 19 Aug 2025 17:42:28 +0100 Subject: [PATCH 2/2] fix clang issue --- implementation/routing/src/routing_manager_base.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/implementation/routing/src/routing_manager_base.cpp b/implementation/routing/src/routing_manager_base.cpp index 1304b65dc..af4969cdf 100644 --- a/implementation/routing/src/routing_manager_base.cpp +++ b/implementation/routing/src/routing_manager_base.cpp @@ -548,7 +548,7 @@ 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 its_event; - bool event_ref_cleared {false}; + bool event_ref_cleared{false}; { std::lock_guard its_lock(events_mutex_); const auto search = events_.find(service_instance_t{_service, _instance}); @@ -558,22 +558,21 @@ void routing_manager_base::unregister_event(client_t _client, service_t _service its_event = found_event->second; its_event->remove_ref(_client, _is_provided); if (!its_event->has_ref()) { - event_ref_cleared=true; + event_ref_cleared = true; search->second.erase(found_event); } } } } - if (its_event){ - if(_is_provided){ + 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 its_eventgroup_info - = find_eventgroup(_service, _instance, eg); + std::shared_ptr 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()) {