From 324acb431da257ae9675903efe3bf9d0efd809de Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Fri, 26 Jun 2015 22:07:50 +0200 Subject: [PATCH] [DEBUG] correct android multiple interface of FSNode --- etk/archive/Archive.cpp | 10 ++++++++-- etk/archive/Archive.h | 4 ++++ etk/os/FSNode.cpp | 37 +++++++++++++++++++++++-------------- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/etk/archive/Archive.cpp b/etk/archive/Archive.cpp index 62aeecc..d15c69e 100644 --- a/etk/archive/Archive.cpp +++ b/etk/archive/Archive.cpp @@ -15,6 +15,7 @@ static const etk::ArchiveContent g_error; const std::string& etk::Archive::getName(size_t _id) const { + std::unique_lock lock(m_mutex); size_t id = 0; for (auto &it : m_content) { if (id == _id) { @@ -27,6 +28,7 @@ const std::string& etk::Archive::getName(size_t _id) const { } const etk::ArchiveContent& etk::Archive::getContent(size_t _id) const { + std::unique_lock lock(m_mutex); size_t id = 0; for (auto &it : m_content) { if (id == _id) { @@ -38,6 +40,7 @@ const etk::ArchiveContent& etk::Archive::getContent(size_t _id) const { } const etk::ArchiveContent& etk::Archive::getContent(const std::string& _key) const { + std::unique_lock lock(m_mutex); auto it = m_content.find(_key); if (it == m_content.end()) { return g_error; @@ -47,11 +50,12 @@ const etk::ArchiveContent& etk::Archive::getContent(const std::string& _key) con bool etk::Archive::exist(const std::string& _key) const { + std::unique_lock lock(m_mutex); return m_content.find(_key) != m_content.end(); } -void etk::Archive::display() -{ +void etk::Archive::display() { + std::unique_lock lock(m_mutex); for (auto &it : m_content) { int32_t size = it.second.getTheoricSize(); int32_t sizeR = it.second.size(); @@ -110,6 +114,7 @@ etk::Archive* etk::Archive::loadPackage(const std::string& _fileName) { void etk::Archive::open(const std::string& _key) { + std::unique_lock lock(m_mutex); auto it = m_content.find(_key); if (it == m_content.end()) { TK_ERROR("Try open an unexistant file : '" << _key << "'"); @@ -123,6 +128,7 @@ void etk::Archive::open(const std::string& _key) { } void etk::Archive::close(const std::string& _key) { + std::unique_lock lock(m_mutex); auto it = m_content.find(_key); if (it == m_content.end()) { TK_ERROR("Try close an unexistant file : '" << _key << "'"); diff --git a/etk/archive/Archive.h b/etk/archive/Archive.h index e3d7c2b..8647a77 100644 --- a/etk/archive/Archive.h +++ b/etk/archive/Archive.h @@ -13,6 +13,8 @@ #define __ETK_ARCHIVE_H__ #include +#include +#include namespace etk { class ArchiveContent { @@ -51,6 +53,8 @@ namespace etk { }; }; class Archive { + private: + mutable std::mutex m_mutex; public: Archive(const std::string& _fileName) : m_fileName(_fileName) { diff --git a/etk/os/FSNode.cpp b/etk/os/FSNode.cpp index 71e1598..ac36994 100644 --- a/etk/os/FSNode.cpp +++ b/etk/os/FSNode.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #ifdef __TARGET_OS__Windows #include #include @@ -126,7 +127,10 @@ std::string etk::simplifyPath(std::string _input) { return _input; } - +static std::mutex& getNodeMutex() { + static std::mutex g_nodeMutex; + return g_nodeMutex; +} // zip file of the apk file for Android ==> set to zip file apk access static std::string s_fileAPK = ""; @@ -156,9 +160,9 @@ std::string etk::FSNodeGetApplicationName() { #ifdef __TARGET_OS__Android static etk::Archive* s_APKArchive = nullptr; - static void loadAPK(std::string& _apkPath) - { - TK_DEBUG("Loading APK \"" << _apkPath << "\""); + static void loadAPK(std::string& _apkPath) { + std::unique_lock lock(getNodeMutex()); + TK_INFO("Loading APK \"" << _apkPath << "\""); s_APKArchive = etk::Archive::load(_apkPath); TK_ASSERT(s_APKArchive != nullptr, "Error loading APK ... \"" << _apkPath << "\""); //Just for debug, print APK contents @@ -166,8 +170,8 @@ std::string etk::FSNodeGetApplicationName() { } #elif defined(__TARGET_OS__Windows) static etk::Archive* s_APKArchive = nullptr; - static void loadAPK(std::string& _apkPath) - { + static void loadAPK(std::string& _apkPath) { + std::unique_lock lock(getNodeMutex()); TK_DEBUG("Loading APK \"" << _apkPath << "\""); s_APKArchive = etk::Archive::loadPackage(_apkPath); TK_ASSERT(s_APKArchive != nullptr, "Error loading APK ... \"" << _apkPath << "\""); @@ -177,19 +181,21 @@ std::string etk::FSNodeGetApplicationName() { #endif // for specific device contraint : -void etk::setBaseFolderData(const char* _folder) -{ +void etk::setBaseFolderData(const char* _folder) { #ifdef __TARGET_OS__Android - baseFolderData = "assets/"; - s_fileAPK = _folder; + { + std::unique_lock lock(getNodeMutex()); + baseFolderData = "assets/"; + s_fileAPK = _folder; + } loadAPK(s_fileAPK); #else TK_WARNING("Not Availlable Outside Android"); #endif } -void etk::setBaseFolderDataUser(const char* _folder) -{ +void etk::setBaseFolderDataUser(const char* _folder) { + std::unique_lock lock(getNodeMutex()); #ifdef __TARGET_OS__Android baseFolderDataUser = _folder; #else @@ -197,8 +203,8 @@ void etk::setBaseFolderDataUser(const char* _folder) #endif } -void etk::setBaseFolderCache(const char* _folder) -{ +void etk::setBaseFolderCache(const char* _folder) { + std::unique_lock lock(getNodeMutex()); #ifdef __TARGET_OS__Android baseFolderCache = _folder; #else @@ -208,6 +214,7 @@ void etk::setBaseFolderCache(const char* _folder) std::string l_argZero = ""; void etk::setArgZero(const std::string& _val) { + std::unique_lock lock(getNodeMutex()); l_argZero = _val; } /* @@ -439,6 +446,7 @@ std::string etk::getUserRunFolder() { #if (defined(__TARGET_OS__Android) || defined(__TARGET_OS__Windows)) bool etk::FSNode::loadDataZip() { + std::unique_lock lock(getNodeMutex()); if (s_APKArchive == nullptr) { return false; } @@ -1574,6 +1582,7 @@ bool etk::FSNode::fileOpenRead() { if (false==loadDataZip()) { return false; } + std::unique_lock lock(getNodeMutex()); s_APKArchive->open(m_systemFileName); return m_zipContent->getTheoricSize() == m_zipContent->size(); }