AurumXML: fix error AtspiAccessibleWatcher uses XMLDocMap before creation of XMLTree. 30/281030/3 accepted/tizen/unified/20220914.164041 accepted/tizen/unified/20220916.124723 accepted/tizen/unified/20220919.012607
authorChihun Jeong <chihun.jeong@samsung.com>
Thu, 8 Sep 2022 05:07:59 +0000 (14:07 +0900)
committerkim hosang <hosang12.kim@samsung.com>
Thu, 8 Sep 2022 07:06:01 +0000 (07:06 +0000)
Change-Id: I3575692f7beeacf1315ac429ff939d1bb5f0c03b

libaurum/inc/AurumXML.h
libaurum/inc/Impl/Accessibility/AtspiAccessibleWatcher.h
libaurum/inc/Impl/Accessibility/MockAccessibleWatcher.h
libaurum/src/AurumXML.cc
libaurum/src/Impl/Accessibility/AtspiAccessibleWatcher.cc

index 989320d..f8a86b1 100644 (file)
@@ -19,6 +19,7 @@
 #define _AURUM_XML_H_
 
 #include <unordered_map>
+#include <mutex>
 
 #include "Accessible.h"
 #include "config.h"
@@ -44,7 +45,7 @@ public:
      *
      * @since_tizen 7.0
      */
-    AurumXML(std::shared_ptr<AccessibleNode> root);
+    AurumXML(std::shared_ptr<AccessibleNode> root, std::mutex& XMLMutex);
 
     /**
      * @brief Destroy the AurumXML object
@@ -130,6 +131,7 @@ private:
     xml_document                                *mDoc;
     std::shared_ptr<AccessibleNode>              mRoot;
     std::unordered_map<std::string, std::shared_ptr<AccessibleNode>> mXNodeMap;
+    std::mutex&                                  XMLMutex;
 };
 }  // namespace Aurum
 
index 90c88a4..e63bf03 100644 (file)
@@ -170,6 +170,7 @@ private:
     static std::mutex mMutex;
     static GMainLoop *mLoop;
     bool isTv;
+    std::mutex XMLMutex;
 };
 
 }
index 5dcce5d..bf480cb 100644 (file)
@@ -98,7 +98,6 @@ private:
 
     std::map<AtspiAccessible *, std::shared_ptr<AccessibleApplication>> mActiveAppMap;
     std::map<std::string, std::shared_ptr<AurumXML>> mXMLDocMap;
-
 };
 
 }
index fe1e0bf..4067afe 100644 (file)
 
 using namespace Aurum;
 
-AurumXML::AurumXML(std::shared_ptr<AccessibleNode> root) : mRoot(root)
+AurumXML::AurumXML(std::shared_ptr<AccessibleNode> root, std::mutex& XMLMutex) : mRoot(root), XMLMutex(XMLMutex)
 {
+    XMLMutex.lock();
+
     mDoc = new xml_document();
     if (mRoot) this->createXMLtree();
+
+    XMLMutex.unlock();
 }
 
 AurumXML::~AurumXML()
index cab5764..8e91895 100644 (file)
@@ -200,7 +200,7 @@ void AtspiAccessibleWatcher::appendApp(AtspiAccessibleWatcher *instance, AtspiAc
             instance->mXMLDocMap.erase(package);
         }
         instance->mXMLDocMap.insert(std::pair<std::string, std::shared_ptr<AurumXML>>(package,
-                std::make_shared<AurumXML>(std::make_shared<AtspiAccessibleNode>(app))));
+                std::make_shared<AurumXML>(std::make_shared<AtspiAccessibleNode>(app), XMLMutex)));
     }
 }
 
@@ -351,6 +351,16 @@ std::map<AtspiAccessible *, std::shared_ptr<AccessibleApplication>> AtspiAccessi
 
 std::map<std::string, std::shared_ptr<AurumXML>> AtspiAccessibleWatcher::getXMLDocMap(void)
 {
+    bool isFirstWaiting = true;
+    while(!XMLMutex.try_lock())
+    {
+        if(isFirstWaiting)
+        {
+            LOGI("Waiting XMLTree Construct");
+            isFirstWaiting = false;
+        }
+    }
+    XMLMutex.unlock();
     return mXMLDocMap;
 }