Fix crash issue 71/307371/3
authorChanggyu Choi <changyu.choi@samsung.com>
Thu, 7 Mar 2024 11:04:51 +0000 (20:04 +0900)
committerChanggyu Choi <changyu.choi@samsung.com>
Thu, 7 Mar 2024 11:22:26 +0000 (11:22 +0000)
This patch solves the problem of repeating an event handler when adding
or removing an event within a callback during an event iteration.

Change-Id: I2a9ebf3bcb467ad7834f2c9cc3737e53b468203b
Signed-off-by: Changgyu Choi <changyu.choi@samsung.com>
tizen_base/event/event_broker.h

index 9dd4b42a718dbcd97d3b825eabc2b365af4f411a..333a8708e50ef6767d923788a898d9dee70db441 100644 (file)
 #define TIZEN_CORE_TIZEN_BASE_EVENT_EVENT_BROKER_H_
 
 #include <functional>
+#include <list>
 #include <memory>
 #include <unordered_map>
 #include <utility>
-#include <vector>
 
 #include <shared-queue.hpp>
 
@@ -46,17 +46,13 @@ class EXPORT_API EventBroker {
   }
 
   void PrependHandler(std::shared_ptr<EventHandler<T>> handler) {
-    handlers_.insert(handlers_.begin(), std::move(handler));
+    handlers_.push_front(std::move(handler));
   }
 
   void RemoveHandler(std::shared_ptr<EventHandler<T>> handler) {
-    auto iter = handlers_.begin();
-    while (iter != handlers_.end()) {
-      if (*iter == handler)
-        iter = handlers_.erase(iter);
-      else
-        iter++;
-    }
+    handlers_.remove_if([&](const std::shared_ptr<EventHandler<T>>& event) {
+      return event == handler;
+    });
   }
 
   void Process() {
@@ -66,7 +62,7 @@ class EXPORT_API EventBroker {
 
     auto iter = handlers_.begin();
     while (iter != handlers_.end()) {
-      auto& handler = *iter;
+      auto handler = *iter;
       iter++;
       if (!handler->OnEventReceived(object.get()))
         break;
@@ -80,7 +76,7 @@ class EXPORT_API EventBroker {
   bool Empty() const { return queue_.IsEmpty(); }
 
  private:
-  std::vector<std::shared_ptr<EventHandler<T>>> handlers_;
+  std::list<std::shared_ptr<EventHandler<T>>> handlers_;
   SharedQueue<std::shared_ptr<EventObject<T>>> queue_;
 };