X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fserver%2Fdatabase%2Fdb_handle_provider.cc;h=375c3eb3786dc347bcbe90d4995341afbacedf41;hb=5a4ffacebfd5c2c9bbf0accbe8f01fe116814a68;hp=14c3f3094fc95201fd329e95e37bbd8397c8bc42;hpb=077fc515c32d7f8c848b578243b3ecbb6fed45f7;p=platform%2Fcore%2Fappfw%2Fpkgmgr-info.git diff --git a/src/server/database/db_handle_provider.cc b/src/server/database/db_handle_provider.cc index 14c3f30..375c3eb 100644 --- a/src/server/database/db_handle_provider.cc +++ b/src/server/database/db_handle_provider.cc @@ -100,7 +100,7 @@ std::string DBHandleProvider::global_parser_filedb_path_; std::string DBHandleProvider::cert_filedb_path_; std::unordered_set DBHandleProvider::writer_pid_list_; std::recursive_mutex DBHandleProvider::lock_; -std::mutex DBHandleProvider::pid_list_lock_; +std::shared_mutex DBHandleProvider::pid_list_lock_; DBHandleProvider::DBHandleProvider(uid_t uid) : uid_(uid), @@ -130,10 +130,16 @@ DBHandleProvider::DBHandleProvider(uid_t uid) } DBHandleProvider& DBHandleProvider::GetInst(uid_t uid) { - static std::mutex singleton_lock_; - std::unique_lock u(singleton_lock_); + static std::shared_mutex singleton_lock_; + std::shared_lock s(singleton_lock_); uid = ConvertUID(uid); + auto it = provider_map_.find(uid); + if (it != provider_map_.end()) + return *(it->second); + + s.unlock(); + std::unique_lock u(singleton_lock_); auto& prov = provider_map_[uid]; if (prov == nullptr) prov.reset(new DBHandleProvider(uid)); @@ -142,7 +148,7 @@ DBHandleProvider& DBHandleProvider::GetInst(uid_t uid) { } bool DBHandleProvider::IsCrashedWriteRequest() { - std::unique_lock u(pid_list_lock_); + std::unique_lock u(pid_list_lock_); if (writer_pid_list_.empty()) return false; @@ -296,7 +302,7 @@ void DBHandleProvider::UnsetMemoryMode(pid_t pid) { } bool DBHandleProvider::IsMemoryDBActive(pid_t pid, bool write) { - std::unique_lock u(pid_list_lock_); + std::unique_lock u(pid_list_lock_); if (!is_user_memdb_set_) return false; @@ -327,7 +333,7 @@ void DBHandleProvider::ReleaseCache() { } bool DBHandleProvider::IsWriter(pid_t pid) { - std::unique_lock u(pid_list_lock_); + std::unique_lock s(pid_list_lock_); return writer_pid_list_.find(pid) != writer_pid_list_.end(); } @@ -355,6 +361,7 @@ int DBHandleProvider::UpdateCache(sqlite3* db, pid_t pid, uid_t uid, bool write, } pkgmgrinfo_filter_x tmp_filter = { 0, }; + tmp_filter.cache_flag = true; int ret = pkginfo_internal_filter_get_list(db, &tmp_filter, uid_, locale.c_str(), list); if (ret == PMINFO_R_OK) { @@ -413,13 +420,21 @@ int DBHandleProvider::UpdateCache(sqlite3* db, pid_t pid, uid_t uid, bool write, } std::vector> DBHandleProvider::GetPackages( - pid_t pid, bool write, pkgmgrinfo_filter_x* filter, + pid_t pid, pkgmgrinfo_filter_x* filter, const std::string& package) { std::vector> ret; auto map_it = pkg_map_.find(package); if (map_it == pkg_map_.end()) return ret; + if (__check_package_storage_status(filter)) { + if (pkgmgrinfo_pkginfo_filter_add_bool(filter, + PMINFO_PKGINFO_PROP_PACKAGE_CHECK_STORAGE, true) != PMINFO_R_OK) { + LOG(ERROR) << "Fail to add check storage value to filter"; + return {}; + } + } + for (auto& info : map_it->second) { bool pass = true; for (auto* it = filter->list; it != nullptr; it = g_slist_next(it)) { @@ -445,7 +460,7 @@ void DBHandleProvider::AddPackage(std::string package, package_x* info) { } std::vector> DBHandleProvider::GetApplications( - pid_t pid, bool write, pkgmgrinfo_filter_x* filter, + pid_t pid, pkgmgrinfo_filter_x* filter, const std::string& app) { /* make metadata filter map */ std::unordered_map metadata_map; @@ -462,6 +477,14 @@ std::vector> DBHandleProvider::GetApplications( if (map_it == app_map_.end()) return ret; + if (pkgmgr_server::internal::check_app_storage_status(filter)) { + if (pkgmgrinfo_appinfo_filter_add_bool(filter, + PMINFO_APPINFO_PROP_APP_CHECK_STORAGE, true) != PMINFO_R_OK) { + LOG(ERROR) << "Fail to add check storage value to filter"; + return {}; + } + } + for (auto& info : map_it->second) { bool pass = true; for (auto* it = filter->list; it != nullptr; it = g_slist_next(it)) { @@ -507,13 +530,13 @@ void DBHandleProvider::AddApplication(std::string app, std::shared_ptr u(pid_list_lock_); + std::unique_lock u(pid_list_lock_); writer_pid_list_.insert(pid); } bool DBHandleProvider::ErasePID(pid_t pid) { - std::unique_lock u(pid_list_lock_); + std::unique_lock u(pid_list_lock_); return writer_pid_list_.erase(pid) == 1; }