summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKichan Kwon <k_c.kwon@samsung.com>2021-01-11 15:06:32 +0900
committerKichan Kwon <k_c.kwon@samsung.com>2021-01-11 17:39:21 +0900
commitf408840a0953e7d68194393d734d30623a22d926 (patch)
treefd6e3e836e661a73656cd9166ce44a7dae576f01
parentfb6075ee0cc8017a428b0a3443d1625f8a550ff6 (diff)
downloadbatterymonitor-plugins-tizen_5.5.tar.gz
batterymonitor-plugins-tizen_5.5.tar.bz2
batterymonitor-plugins-tizen_5.5.zip
- If app is not terminated, batterymonitor will endlessly request to AMD to check whether app is terminated or not - To prevent overload, register callback and set app termination flag Change-Id: I68c8ae212c892d02030f72353b9c69ecda87391e Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
-rw-r--r--plugin/cpu/src/bm_cpu_plugin.c82
1 files changed, 51 insertions, 31 deletions
diff --git a/plugin/cpu/src/bm_cpu_plugin.c b/plugin/cpu/src/bm_cpu_plugin.c
index 285b051..ead2e76 100644
--- a/plugin/cpu/src/bm_cpu_plugin.c
+++ b/plugin/cpu/src/bm_cpu_plugin.c
@@ -53,6 +53,7 @@
struct app_status {
uint last_used_time; // used_time = utime + stime
uint cur_used_time;
+ bool is_terminated;
};
struct cpu_time {
@@ -86,16 +87,45 @@ void free_atm_st1(gpointer data)
free(atm);
}
-bool is_running_app(const char *appid)
+void check_app_termination(app_context_h app_context, app_context_event_e event, void *user_data)
{
- bool is_running = false;
- int ret = app_manager_is_running(appid, &is_running);
+ int ret;
+ pid_t pid;
+ char *appid = NULL;
+ struct app_status *app_status = NULL;
+ char buf[BUF_SIZE];
+
+ if (event != APP_CONTEXT_EVENT_TERMINATED)
+ return;
+
+ ret = app_context_get_pid(app_context, &pid);
if (ret != APP_MANAGER_ERROR_NONE) {
- _E("app_manager_is_running failed (%d)", ret);
- return false;
+ _E("app_context_get_pid failed (%d)", ret);
+ return;
+ }
+ ret = app_context_get_app_id(app_context, &appid);
+ if (ret != APP_MANAGER_ERROR_NONE) {
+ _E("app_context_get_app_id failed (%d)", ret);
+ return;
+ }
+
+ snprintf(buf, BUF_SIZE, "%s %u", appid, pid);
+ app_status = g_hash_table_lookup(running_app_list, buf);
+ if (!app_status) {
+ _D("Add running app : %s(PID=%u)", appid, pid);
+ app_status = calloc(1, sizeof(struct app_status));
+ if (!app_status) {
+ _E("calloc failed");
+ goto clean_appid;
+ }
+ g_hash_table_insert(running_app_list, g_strdup(buf), app_status);
}
- return is_running;
+ _D("%s(PID=%u) is terminated", appid, pid);
+ app_status->is_terminated = true;
+
+clean_appid:
+ free(appid);
}
int get_cpu_time(struct cpu_time *cpu_time)
@@ -134,6 +164,8 @@ int deinit()
running_app_list = NULL;
}
+ app_manager_unset_app_context_event_cb();
+
EXIT;
return BM_PLUGIN_ERROR_NONE;
}
@@ -170,6 +202,12 @@ int init()
goto failed;
}
+ ret = app_manager_set_app_context_event_cb(check_app_termination, NULL);
+ if (ret != APP_MANAGER_ERROR_NONE) {
+ _E("app_manager_set_app_context_event_cb failed (%d)", ret);
+ goto failed;
+ }
+
EXIT;
return BM_PLUGIN_ERROR_NONE;
@@ -211,8 +249,6 @@ int get_feature_data(bm_data_h *handle, bm_plugin_data_type_e type)
process_cpu_usage_s *cpu_usage;
GHashTableIter iter;
gpointer g_key, g_val;
- char *cur_appid;
- int is_terminated;
/* App time map */
GSList *atm_elem;
@@ -337,17 +373,14 @@ int get_feature_data(bm_data_h *handle, bm_plugin_data_type_e type)
/* Insert newly launched app in the running app list */
if (!app_status) {
- _D("%s(PID=%u) is newly launched", appid, pid);
- app_status = malloc(sizeof(struct app_status));
+ _D("Add running app : %s(PID=%u)", appid, pid);
+ app_status = calloc(1, sizeof(struct app_status));
if (!app_status) {
- _E("malloc failed");
+ _E("calloc failed");
ret = BM_PLUGIN_ERROR_OUT_OF_MEMORY;
goto clean_atm;
}
- app_status->last_used_time = 0;
- app_status->cur_used_time = JIFFY_TO_MS(utime + stime);
g_hash_table_insert(running_app_list, g_strdup(buf), app_status);
- continue;
}
/* Update app status */
@@ -359,23 +392,9 @@ int get_feature_data(bm_data_h *handle, bm_plugin_data_type_e type)
while (g_hash_table_iter_next(&iter, &g_key, &g_val)) {
data = (const char *)g_key;
app_status = (struct app_status *)g_val;
- is_terminated = 0;
sscanf(data, "%s %u", buf, &pid);
- /* Check whether app is running */
- ret = app_manager_get_app_id(pid, &cur_appid);
- switch (ret) {
- case APP_MANAGER_ERROR_NONE:
- if (strncmp(buf, cur_appid, strlen(cur_appid) + 1))
- is_terminated = 1;
- free(cur_appid);
- break;
- default:
- is_terminated = 1;
- break;
- }
-
- if (!is_terminated) {
+ if (!app_status->is_terminated) {
/* Get latest CPU time */
ret = runtime_info_get_process_cpu_usage((int *)&pid, 1, &cpu_usage);
if (ret == RUNTIME_INFO_ERROR_NONE) {
@@ -419,12 +438,13 @@ int get_feature_data(bm_data_h *handle, bm_plugin_data_type_e type)
update_list:
/* Remove terminated app's status */
- if (is_terminated) {
- _D("%s(PID=%u) is already terminated", buf, pid);
+ if (app_status->is_terminated) {
+ _D("Remove running app : %s(PID=%u)", buf, pid);
g_hash_table_iter_remove(&iter);
} else
app_status->last_used_time = app_status->cur_used_time;
}
+ _I("The number of running apps : %u", g_hash_table_size(running_app_list));
/* Update last requested time */
last_requested_time = current_time;