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 989320da49548524589d93d8e9d0536121e678f1..f8a86b1d8b0057e30795e8a59998d4cfb552e705 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 90c88a49865c3a5f74995f8f89b9038e1030c068..e63bf03bf49e28905b74097ea83002006d03a2cf 100644 (file)
@@ -170,6 +170,7 @@ private:
     static std::mutex mMutex;
     static GMainLoop *mLoop;
     bool isTv;
+    std::mutex XMLMutex;
 };
 
 }
index 5dcce5d6382ab55cc4e4eed9f8027f1c859cdeea..bf480cb3a5fb26841aa0ee0dc530c72c9bcffca5 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 fe1e0bf820a1a17db25abfaf850ad82cf815ec6e..4067afe25255c604dd8a51d4645b63ce78249a3b 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 cab5764e0b85d82d3f1d031d679134c28985d413..8e918959b1f1c0f89f7c41244d5be059025ea2b1 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;
 }