libaurum: add call_once when UiDevice is created for thread safety. 21/288321/1
authorHosang Kim <hosang12.kim@samsung.com>
Wed, 15 Feb 2023 05:57:26 +0000 (14:57 +0900)
committerHosang Kim <hosang12.kim@samsung.com>
Wed, 15 Feb 2023 05:57:26 +0000 (14:57 +0900)
UiDevice is singleton object so thread safety is necessary.

Change-Id: I1233fd768ae2e2f57d53fd069167195c965e57e9

libaurum/inc/UiDevice.h
libaurum/src/UiDevice.cc

index 025221f..b79fbe6 100644 (file)
@@ -505,6 +505,7 @@ private:
 #ifdef MQTT_ENABLED
     static std::shared_ptr<ScreenAnalyzerWatcher> mSAWatcher;
 #endif
+    static std::once_flag mOnceFlag;
 };
 
 }
index 4865aa6..c266122 100644 (file)
@@ -40,6 +40,7 @@ using namespace AurumInternal;
 #define WM_METHOD_NAME_INFO "GetVisibleWinInfo_v2"
 
 std::vector<std::shared_ptr<TizenWindow>> UiDevice::mTizenWindows;
+std::once_flag UiDevice::mOnceFlag;
 static GDBusConnection *system_conn;
 
 #ifdef MQTT_ENABLED
@@ -68,19 +69,17 @@ UiDevice::~UiDevice()
 std::shared_ptr<UiDevice> UiDevice::getInstance(IDevice *deviceImpl)
 {
     static std::shared_ptr<UiDevice> device{nullptr};
-
-    if (deviceImpl) {
-        device.reset(new UiDevice(deviceImpl));
-    } else {
-        if (device) return device;
-        else {
+    std::call_once(mOnceFlag, [deviceImpl] {
+        if (deviceImpl) {
+            device.reset(new UiDevice(deviceImpl));
+        } else {
 #ifdef TIZEN
             device.reset(new UiDevice(new TizenDeviceImpl()));
 #else
             device.reset(new UiDevice(new MockDeviceImpl()));
 #endif
         }
-    }
+    });
 
     return device;
 }