[M120][WRTjs] Fix ApplicationData instance thread safety issue 21/305421/5
authorzhaosy <shiyusy.zhao@samsung.com>
Fri, 5 Jan 2024 05:08:58 +0000 (13:08 +0800)
committerDongHyun Song <dh81.song@samsung.com>
Fri, 2 Feb 2024 09:44:03 +0000 (09:44 +0000)
When app is launched, ApplicationData instance maybe is created
by multi-threads(main thread, prelaunch worker, reallaunch worker)
at the same time.
So add lock in ApplicationData::GetInstance.

Reference:
https://review.tizen.org/gerrit/#/c/platform/framework/web/chromium-efl/+/304102/

Change-Id: I883711947700e3cc973f2ad2ce4deee989708517
Signed-off-by: DongHyun Song <dh81.song@samsung.com>
wrt/src/common/application_data.cc [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 7166428..ad1ddf5
@@ -72,6 +72,7 @@ const char* kDefaultStartFiles[] = {
 std::map<std::string, std::string> pkg_paths_;
 std::string wrt_res_path_;
 base::Lock data_lock_;
+base::Lock instance_lock_;
 
 static ApplicationData* instance = nullptr;
 
@@ -159,12 +160,15 @@ ApplicationData::~ApplicationData() {}
 
 // static
 ApplicationData& ApplicationData::GetInstance() {
-  if (!instance)
+  if (!instance) {
+    base::AutoLock lock(instance_lock_);
+    if (!instance)  // double check to avoid create instance again
 #if BUILDFLAG(IS_TIZEN_TV)
-    instance = new ApplicationDataTV;
+      instance = new ApplicationDataTV;
 #else
-    instance = new ApplicationData;
+      instance = new ApplicationData;
 #endif
+  }
   return *instance;
 }