Fix multi-threaded issue with es_proxy_ variable reset 72/323472/2
authorinkyun.kil <inkyun.kil@samsung.com>
Tue, 29 Apr 2025 05:19:06 +0000 (14:19 +0900)
committerinkyun.kil <inkyun.kil@samsung.com>
Tue, 29 Apr 2025 05:32:46 +0000 (14:32 +0900)
Change-Id: Ic4f5beb7f4298df22146ca1e0f5e3cae2805cf5e
Signed-off-by: inkyun.kil <inkyun.kil@samsung.com>
src/es.cc

index 28d2a366cd61ed738feb047f2e504e6c8873cf0b..c1e796b870d9b94182b4f1e3e2a47dc6c83d8fc5 100644 (file)
--- a/src/es.cc
+++ b/src/es.cc
@@ -34,6 +34,7 @@ constexpr const char SYS_EVENT_NAME_PREFIX[] = "tizen.system.event";
 
 std::future<void> connection_fut_;
 
+std::recursive_mutex mtx;
 std::shared_ptr<rpc_proxy::EventSystem> es_proxy_;
 
 class Event : public rpc_proxy::EventSystem::EventListener {
@@ -113,6 +114,7 @@ extern "C" EXPORT_API int eventsystem_send_user_event(const char* event_name,
                                                       bundle* data,
                                                       bool is_trusted) {
   try {
+    std::lock_guard<std::recursive_mutex> lock(mtx);
     ::Connect();
 
     if (!es_proxy_->SendUserEvent(event_name, rpc::Bundle(data, false, false),
@@ -134,6 +136,7 @@ extern "C" EXPORT_API int eventsystem_register_application_event(
     const char* event_name, unsigned int* reg_id, int* event_type,
     eventsystem_cb callback, void* user_data) {
   try {
+    std::lock_guard<std::recursive_mutex> lock(mtx);
     std::string name = event_name;
     auto ev = std::unique_ptr<rpc_proxy::EventSystem::EventListener>(
         new Event(callback, user_data));
@@ -193,6 +196,7 @@ extern "C" EXPORT_API int eventsystem_unregister_application_event(
 }
 
 extern "C" EXPORT_API int eventsystem_application_finalize() {
+  std::lock_guard<std::recursive_mutex> lock(mtx);
   if (!es_proxy_) return 0;
   es_proxy_.reset();
   return 0;
@@ -202,6 +206,7 @@ extern "C" EXPORT_API int eventsystem_register_event(
     const char* event_name, unsigned int* reg_id, eventsystem_handler callback,
     void* user_data) {
   try {
+    std::lock_guard<std::recursive_mutex> lock(mtx);
     ::Connect();
 
     auto ev = std::unique_ptr<rpc_proxy::EventSystem::EventListener>(
@@ -225,6 +230,7 @@ extern "C" EXPORT_API int eventsystem_register_event(
 }
 
 extern "C" EXPORT_API int eventsystem_unregister_event(unsigned int reg_id) {
+  std::lock_guard<std::recursive_mutex> lock(mtx);
   if (es_proxy_ && es_proxy_->GetSizeAsyncEventList() > 0) {
     _W("Try unregister on async connecting...");
 
@@ -261,6 +267,7 @@ extern "C" EXPORT_API int eventsystem_unregister_event(unsigned int reg_id) {
 extern "C" EXPORT_API int eventsystem_send_system_event(const char* event_name,
                                                         bundle* data) {
   try {
+    std::lock_guard<std::recursive_mutex> lock(mtx);
     ::Connect();
 
     auto b = rpc::Bundle(data, false, false);
@@ -287,6 +294,7 @@ extern "C" EXPORT_API int eventsystem_request_sending_system_event(
 extern "C" EXPORT_API int eventsystem_keep_last_event_data(
     const char* event_name) {
   try {
+    std::lock_guard<std::recursive_mutex> lock(mtx);
     ::Connect();
 
     if (!es_proxy_->KeepLastEventData(event_name)) {