From a7ef3efbbd36a830c10410978fda777eeff53190 Mon Sep 17 00:00:00 2001 From: Chihun Jeong Date: Tue, 7 Mar 2023 16:45:29 +0900 Subject: [PATCH] AurumXML: Improve performance Change-Id: I3a2fd3ba244b9a6055f1cb3ef2c2f67a4eab08b6 --- .../inc/Accessibility/AccessibleWatcher.h | 12 +++++- libaurum/inc/AurumXML.h | 4 +- .../Accessibility/AtspiAccessibleWatcher.h | 17 +++++++- .../Accessibility/MockAccessibleWatcher.h | 2 + libaurum/src/AurumXML.cc | 11 +++-- libaurum/src/Comparer.cc | 6 +-- .../Impl/Accessibility/AtspiAccessibleNode.cc | 6 +-- .../Accessibility/AtspiAccessibleWatcher.cc | 40 ++++++++++++++----- .../Accessibility/MockAccessibleWatcher.cc | 5 +++ 9 files changed, 76 insertions(+), 27 deletions(-) diff --git a/libaurum/inc/Accessibility/AccessibleWatcher.h b/libaurum/inc/Accessibility/AccessibleWatcher.h index 6a26dbc..42e0756 100644 --- a/libaurum/inc/Accessibility/AccessibleWatcher.h +++ b/libaurum/inc/Accessibility/AccessibleWatcher.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved + * Copyright (c) 2023 Samsung Electronics Co., Ltd All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -129,6 +129,16 @@ public: */ virtual std::map> getXMLDocMap(void) = 0; + /** + * @brief Gets AurumXML pointer of a specific package name. + * + * @param[in] pkgName name of package. + * + * @return pointer of AurumXML the package if exist, else null pointer + * @since_tizen 7.5 + */ + virtual std::shared_ptr getXMLDoc(std::string pkgName) = 0; + /** * @brief Register atspi event callback. * diff --git a/libaurum/inc/AurumXML.h b/libaurum/inc/AurumXML.h index f7b9617..025508e 100644 --- a/libaurum/inc/AurumXML.h +++ b/libaurum/inc/AurumXML.h @@ -20,6 +20,7 @@ #include #include +#include #include #include "Accessible.h" @@ -46,7 +47,7 @@ public: * * @since_tizen 7.0 */ - AurumXML(const std::shared_ptr root, std::mutex& XMLMutex); + AurumXML(const std::shared_ptr root, int *appXMLLoadedCount, std::mutex *XMLMutex, std::condition_variable *XMLConditionVar); /** * @brief Destroy the AurumXML object @@ -145,7 +146,6 @@ private: xml_document *mDoc; const std::shared_ptr mRoot; std::unordered_map> mXNodeMap; - std::mutex& XMLMutex; }; } // namespace Aurum diff --git a/libaurum/inc/Impl/Accessibility/AtspiAccessibleWatcher.h b/libaurum/inc/Impl/Accessibility/AtspiAccessibleWatcher.h index 2136587..9a51680 100644 --- a/libaurum/inc/Impl/Accessibility/AtspiAccessibleWatcher.h +++ b/libaurum/inc/Impl/Accessibility/AtspiAccessibleWatcher.h @@ -31,6 +31,8 @@ #include #include #include +#include +#include using namespace Aurum; @@ -130,6 +132,11 @@ public: */ virtual std::map> getXMLDocMap(void) override; + /** + * @copydoc @AccessibleWatcher::getXMLDoc() + */ + virtual std::shared_ptr getXMLDoc(std::string pkgName) override; + /** * @copydoc @AccessibleWatcher::registerCallback() */ @@ -178,8 +185,16 @@ private: static std::mutex mMutex; static GMainLoop *mLoop; bool isTv; - std::mutex XMLMutex; std::map>> mHandlers; + + int mAppCount; + + // this variable should be protected by XMLMutex. + int mAppXMLLoadedCount; + + std::mutex mXMLMutex; + std::condition_variable mXMLConditionVar; + static GThread *mTimerThread; static gint64 mStartTime; static IdleEventState isIdle; diff --git a/libaurum/inc/Impl/Accessibility/MockAccessibleWatcher.h b/libaurum/inc/Impl/Accessibility/MockAccessibleWatcher.h index 622e26d..cfe66c3 100644 --- a/libaurum/inc/Impl/Accessibility/MockAccessibleWatcher.h +++ b/libaurum/inc/Impl/Accessibility/MockAccessibleWatcher.h @@ -79,6 +79,8 @@ public: std::map> getXMLDocMap(void); + std::shared_ptr getXMLDoc(std::string pkgName); + public: /** * @brief TBD diff --git a/libaurum/src/AurumXML.cc b/libaurum/src/AurumXML.cc index 2925fde..ea41c31 100644 --- a/libaurum/src/AurumXML.cc +++ b/libaurum/src/AurumXML.cc @@ -19,14 +19,17 @@ using namespace Aurum; -AurumXML::AurumXML(const std::shared_ptr root, std::mutex& XMLMutex) : mRoot(root), XMLMutex(XMLMutex) +AurumXML::AurumXML(const std::shared_ptr root, int *appXMLLoadedCount, std::mutex *XMLMutex, std::condition_variable *XMLConditionVar) +: mRoot(root) { - XMLMutex.lock(); - mDoc = new xml_document(); if (mRoot) this->createXMLtree(); - XMLMutex.unlock(); + XMLMutex->lock(); + LOGI("XML Document Created: %s", root->getId().c_str()); + (*appXMLLoadedCount)++; + XMLMutex->unlock(); + XMLConditionVar->notify_all(); } AurumXML::~AurumXML() diff --git a/libaurum/src/Comparer.cc b/libaurum/src/Comparer.cc index fa09542..3082249 100644 --- a/libaurum/src/Comparer.cc +++ b/libaurum/src/Comparer.cc @@ -59,12 +59,10 @@ std::vector> Comparer::findObjects(const std::sh if (selector->mMatchXPath) { std::vector> merged{}; - auto XMLDocMap = AccessibleWatcher::getInstance()->getXMLDocMap(); std::string pkg = root->getPkg(); + auto XMLDoc = AccessibleWatcher::getInstance()->getXMLDoc(pkg); - if (XMLDocMap.count(pkg) == 0) return merged; - - auto XMLDoc = XMLDocMap[pkg]; + if (XMLDoc.get() == nullptr) return merged; auto tmp = XMLDoc->findObjects(selector->mXPath, earlyReturn); std::move(std::begin(tmp), std::end(tmp), std::back_inserter(merged)); diff --git a/libaurum/src/Impl/Accessibility/AtspiAccessibleNode.cc b/libaurum/src/Impl/Accessibility/AtspiAccessibleNode.cc index ead1399..2dc48ce 100644 --- a/libaurum/src/Impl/Accessibility/AtspiAccessibleNode.cc +++ b/libaurum/src/Impl/Accessibility/AtspiAccessibleNode.cc @@ -245,10 +245,8 @@ void AtspiAccessibleNode::updateExtents() void AtspiAccessibleNode::updateXPath() { - auto XMLDocMap = AccessibleWatcher::getInstance()->getXMLDocMap(); - if (XMLDocMap.count(mPkg) == 0) return; - - auto XMLDoc = XMLDocMap[mPkg]; + auto XMLDoc = AccessibleWatcher::getInstance()->getXMLDoc(mPkg); + if (XMLDoc.get() == nullptr) return; mXPath = XMLDoc->getXPath(shared_from_this()); } diff --git a/libaurum/src/Impl/Accessibility/AtspiAccessibleWatcher.cc b/libaurum/src/Impl/Accessibility/AtspiAccessibleWatcher.cc index 7ceecb5..358b191 100644 --- a/libaurum/src/Impl/Accessibility/AtspiAccessibleWatcher.cc +++ b/libaurum/src/Impl/Accessibility/AtspiAccessibleWatcher.cc @@ -134,6 +134,9 @@ AtspiAccessibleWatcher::AtspiAccessibleWatcher() GVariant *result = nullptr; GError *error = nullptr; + mAppCount = 0; + mAppXMLLoadedCount = 0; + atspi_init(); mEventThread = g_thread_new("AtspiEventThread", eventThreadLoop, this); @@ -204,8 +207,10 @@ void AtspiAccessibleWatcher::appendApp(AtspiAccessibleWatcher *instance, AtspiAc if (instance->mXMLDocMap.count(package)) { instance->mXMLDocMap.erase(package); } + + mAppCount++; instance->mXMLDocMap.insert(std::pair>(package, - std::make_shared(std::make_shared(app), XMLMutex))); + std::make_shared(std::make_shared(app), &mAppXMLLoadedCount, &mXMLMutex, &mXMLConditionVar))); } } @@ -442,19 +447,32 @@ std::map> AtspiAccessi std::map> AtspiAccessibleWatcher::getXMLDocMap(void) { - bool isFirstWaiting = true; - while(!XMLMutex.try_lock()) - { - if(isFirstWaiting) - { - LOGI("Waiting XMLTree Construct"); - isFirstWaiting = false; - } - } - XMLMutex.unlock(); + std::unique_lock lk(mXMLMutex); + + //LOGI("mAppCount: %d, mAppXMLLoadedCount: %d", mAppCount, mAppXMLLoadedCount); + mXMLConditionVar.wait(lk, [&] {return mAppCount <= mAppXMLLoadedCount;}); + + lk.unlock(); + return mXMLDocMap; } +std::shared_ptr AtspiAccessibleWatcher::getXMLDoc(std::string pkgName) +{ + std::unique_lock lk(mXMLMutex); + + //LOGI("mAppCount: %d, mAppXMLLoadedCount: %d", mAppCount, mAppXMLLoadedCount); + mXMLConditionVar.wait(lk, [&] {return mAppCount <= mAppXMLLoadedCount;}); + + lk.unlock(); + + if (mXMLDocMap.count(pkgName) > 0) + return mXMLDocMap[pkgName]; + else + return std::shared_ptr(nullptr); + +} + bool AtspiAccessibleWatcher::removeFromActivatedList(AtspiAccessible *node) { LOGI("remove from activelist node %p", node); diff --git a/libaurum/src/Impl/Accessibility/MockAccessibleWatcher.cc b/libaurum/src/Impl/Accessibility/MockAccessibleWatcher.cc index e054ced..1303e28 100644 --- a/libaurum/src/Impl/Accessibility/MockAccessibleWatcher.cc +++ b/libaurum/src/Impl/Accessibility/MockAccessibleWatcher.cc @@ -60,6 +60,11 @@ std::map> MockAccessibleWatcher::getXMLDo return mXMLDocMap; } +std::shared_ptr MockAccessibleWatcher::getXMLDoc(std::string pkgName) +{ + return std::shared_ptr(); +} + std::shared_ptr MockAccessibleWatcher::addApplication(std::string pkgName, Rect geometry, int ifaces, int properties) { std::shared_ptr appNode = std::make_shared(nullptr, pkgName, pkgName, "application", "", "Elm_Win", "default", "", geometry, ifaces, properties); -- 2.34.1