[Iotcon] Prevent concurent access to map 99/314099/1
authorPiotr Kosko/Tizen API (PLT) /SRPOL/Engineer/Samsung Electronics <p.kosko@samsung.com>
Fri, 5 Jul 2024 05:27:31 +0000 (07:27 +0200)
committerPiotr Kosko/Tizen API (PLT) /SRPOL/Engineer/Samsung Electronics <p.kosko@samsung.com>
Fri, 5 Jul 2024 06:54:45 +0000 (08:54 +0200)
Iotcon service seems to call Store/RemoveRemoteResource from different
threads. It was found a cause of crash on TV (KONA DF240619-01092) this
commit should prevent crash in the future.

[Verification] Iotcon TCT passrate 100% (PontusM)

Change-Id: I741d0d06a4a7918cf05cd590df68e8de9e78bc5f

src/iotcon/iotcon_client_manager.cc
src/iotcon/iotcon_client_manager.h

index e34193f3553b62b0d183794e85e5baf85e9d5f54..5920e7aabb86a8e925ab624aec6f043d61e13033 100644 (file)
@@ -138,25 +138,31 @@ common::TizenResult IotconClientManager::RemovePresenceEventListener(long long i
 
 picojson::value IotconClientManager::StoreRemoteResource(FoundRemoteInfoPtr ptr) {
   ScopeLogger();
-  if (0 == ptr->id) {
-    LoggerD("New remote, needed to be added to map");
-    ptr->id = GetRemoteNextId();
-    remotes_map_.insert(std::make_pair(ptr->id, ptr));
-  } else {
-    LoggerD("Remote is already stored, just increase ref_count");
-    ptr->ref_count++;
+  {
+    std::lock_guard<std::mutex> guard(remotes_map_mutex_);
+    if (0 == ptr->id) {
+      LoggerD("New remote, needed to be added to map");
+      ptr->id = GetRemoteNextId();
+      remotes_map_.insert(std::make_pair(ptr->id, ptr));
+    } else {
+      LoggerD("Remote is already stored, just increase ref_count");
+      ptr->ref_count++;
+    }
   }
   return PrepareManageIdAnswer(true, ptr->id);
 }
 
 picojson::value IotconClientManager::RemoveRemoteResource(FoundRemoteInfoPtr ptr) {
   ScopeLogger();
-  ptr->ref_count--;
-  if (ptr->ref_count <= 0) {
-    LoggerD("Handle not needed anymore, removing from map");
-    Remove(ptr->id);
-    remotes_map_.erase(ptr->id);
-    return PrepareManageIdAnswer(false);
+  {
+    std::lock_guard<std::mutex> guard(remotes_map_mutex_);
+    ptr->ref_count--;
+    if (ptr->ref_count <= 0) {
+      LoggerD("Handle not needed anymore, removing from map");
+      Remove(ptr->id);
+      remotes_map_.erase(ptr->id);
+      return PrepareManageIdAnswer(false);
+    }
   }
   return PrepareManageIdAnswer(true, ptr->id);
 }
index f3fccefc5821e9c41cf72f4c33e9b69a44c357c7..4302fb183ff7725d50f31172d78bf65e726dd4ac 100644 (file)
@@ -59,6 +59,7 @@ class IotconClientManager {
 
   PresenceMap presence_map_;
   FoundRemotesMap remotes_map_;
+  std::mutex remotes_map_mutex_;
   IdVector ids_;
 };