From 9cdf2f38a5cd97f2ea400d6b390b3fd171d09d24 Mon Sep 17 00:00:00 2001
From: "Piotr Kosko/Tizen API (PLT) /SRPOL/Engineer/Samsung Electronics"
Date: Tue, 6 Sep 2022 09:13:56 +0200
Subject: [PATCH] [Common][Package] Avoid recalling app_info_create() for
consecutive calls
app_info_create occasionally when the device is freshly reboot takes
much time to gather data (over 1 second), which causes a serious delay
when the function is called several times in the row without caching the
result.
This modification makes a single call of app_info_create() at first try
and then only return previously fetched value.
[Verification] Code compiles without errors.
TCT application, package, deprecated - passrate didn't change.
Change-Id: Ifc989d5eb0f7435f1a6451613d289d6d3851e979
---
src/common/tools.cc | 29 ++++-------------------------
src/package/package_info_provider.cc | 33 +++++++--------------------------
src/package/package_info_provider.h | 2 +-
3 files changed, 12 insertions(+), 52 deletions(-)
diff --git a/src/common/tools.cc b/src/common/tools.cc
index b39b2cd..2e4d02a 100644
--- a/src/common/tools.cc
+++ b/src/common/tools.cc
@@ -36,6 +36,7 @@
#include "common/logger.h"
#include "common/scope_exit.h"
+#include "common/current_application.h"
namespace common {
namespace tools {
@@ -421,22 +422,10 @@ PlatformResult GetPkgApiVersion(std::string* api_version) {
static std::string cached_api_version;
static int cached_pid = -1;
- char* app_id = nullptr;
- char* pkgid = nullptr;
char* api_ver = nullptr;
- app_info_h app_handle = nullptr;
pkgmgrinfo_pkginfo_h pkginfo_handle = nullptr;
SCOPE_EXIT {
- if (app_id) {
- free(app_id);
- }
- if (pkgid) {
- free(pkgid);
- }
- if (app_handle) {
- app_info_destroy(app_handle);
- }
if (pkginfo_handle) {
pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_handle);
}
@@ -446,22 +435,12 @@ PlatformResult GetPkgApiVersion(std::string* api_version) {
if (cached_pid == pid) {
*api_version = cached_api_version; // Retrieve from local cache
} else {
- int ret = app_manager_get_app_id(pid, &app_id);
- if (ret != APP_MANAGER_ERROR_NONE) {
- return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Fail to get app id");
- }
-
- ret = app_info_create(app_id, &app_handle);
- if (ret != APP_MANAGER_ERROR_NONE) {
- return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Fail to get app info");
- }
-
- ret = app_info_get_package(app_handle, &pkgid);
- if ((ret != APP_MANAGER_ERROR_NONE) || (pkgid == nullptr)) {
+ const char *pkgid =common::CurrentApplication::GetInstance().GetPackageId().c_str();
+ if (pkgid == nullptr) {
return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Fail to get pkg id");
}
- ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, getuid(), &pkginfo_handle);
+ int ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, getuid(), &pkginfo_handle);
if (ret != PMINFO_R_OK) {
return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Fail to get pkginfo_h");
}
diff --git a/src/package/package_info_provider.cc b/src/package/package_info_provider.cc
index 40f1a6b..5844fac 100644
--- a/src/package/package_info_provider.cc
+++ b/src/package/package_info_provider.cc
@@ -29,6 +29,7 @@
#include "common/logger.h"
#include "common/scope_exit.h"
#include "common/tools.h"
+#include "common/current_application.h"
namespace extension {
namespace package {
@@ -88,10 +89,9 @@ void PackageInfoProvider::GetPackagesInfo(picojson::object& out) {
void PackageInfoProvider::GetPackageInfo(picojson::object& out) {
ScopeLogger();
- char* package_id = NULL;
+ std::string package_id;
if (GetCurrentPackageId(&package_id)) {
- GetPackageInfo(package_id, out);
- free(package_id);
+ GetPackageInfo(package_id.c_str(), out);
} else {
LoggerE("Failed to get current package ID");
REPORT_ERROR(out, NotFoundException("The package with the specified ID is not found"));
@@ -258,31 +258,12 @@ void PackageInfoProvider::GetDataSize(const std::string& id, picojson::object* o
GetSize(id, PM_GET_DATA_SIZE, out);
}
-bool PackageInfoProvider::GetCurrentPackageId(char** package_id) {
+bool PackageInfoProvider::GetCurrentPackageId(std::string* package_id) {
ScopeLogger();
- int ret = 0;
- char* app_id = NULL;
-
- int pid = getpid();
- ret = app_manager_get_app_id(pid, &app_id);
- if (ret != APP_MANAGER_ERROR_NONE) {
- LoggerE("Failed to get app id: %d (%s)", ret, get_error_message(ret));
- return false;
- }
-
- app_info_h handle;
- ret = app_info_create(app_id, &handle);
- free(app_id);
- if (ret != APP_MANAGER_ERROR_NONE) {
- LoggerE("Fail to get app info: %d (%s)", ret, get_error_message(ret));
- return false;
- }
-
- ret = app_info_get_package(handle, package_id);
- app_info_destroy(handle);
- if ((ret != APP_MANAGER_ERROR_NONE) || (*package_id == NULL)) {
- LoggerE("Fail to get pkg id: %d (%s)", ret, get_error_message(ret));
+ *package_id = common::CurrentApplication::GetInstance().GetPackageId();
+ if (package_id->empty()) {
+ LoggerE("Fail to get pkg id. Result is empty");
return false;
}
diff --git a/src/package/package_info_provider.h b/src/package/package_info_provider.h
index 894b2b8..33009b6 100644
--- a/src/package/package_info_provider.h
+++ b/src/package/package_info_provider.h
@@ -54,7 +54,7 @@ class PackageInfoProvider {
static void GetDataSize(const std::string& id, picojson::object* out);
private:
- static bool GetCurrentPackageId(char** package_id);
+ static bool GetCurrentPackageId(std::string* package_id);
};
} // namespace package
--
2.7.4