summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbhishek Vijay <abhishek.v@samsung.com>2020-10-06 20:04:35 +0530
committerRandeep Singh <randeep.s@samsung.com>2020-11-25 12:46:47 +0000
commita55c95722aed0befc3e658a42a5d563a572b7453 (patch)
tree2d8e83b3af5cc54ab4a75a2a622d6caaa2447d8a
parentb56cc74fa9b16c5242826b5b6e917093485c41e6 (diff)
downloadbatterymonitor-a55c95722aed0befc3e658a42a5d563a572b7453.tar.gz
batterymonitor-a55c95722aed0befc3e658a42a5d563a572b7453.tar.bz2
batterymonitor-a55c95722aed0befc3e658a42a5d563a572b7453.zip
[Non-ACR] improve lock/unlock & get-app_id logicsubmit/tizen/20201125.130033
Change-Id: Ifc7220f86cb76b1aa1eb7a98b95233f7e107d293 Signed-off-by: Abhishek Vijay <abhishek.v@samsung.com>
-rw-r--r--include/bm_util.h2
-rw-r--r--src/battery_dump/bm_listeners.c148
-rw-r--r--src/bm_util.c49
3 files changed, 114 insertions, 85 deletions
diff --git a/include/bm_util.h b/include/bm_util.h
index 3349270..dd88ea6 100644
--- a/include/bm_util.h
+++ b/include/bm_util.h
@@ -61,7 +61,7 @@ GDBusConnection* bm_get_dbus_connection_obj(void);
void bd_get_focussed_app_id(char **app_name);
-void bm_get_name_for_pid(pid_t pid, char **pname);
+void bm_get_symlink_for_pid(pid_t pid, char **pname);
void bm_data_free(gpointer data);
diff --git a/src/battery_dump/bm_listeners.c b/src/battery_dump/bm_listeners.c
index 5f4632d..480d58d 100644
--- a/src/battery_dump/bm_listeners.c
+++ b/src/battery_dump/bm_listeners.c
@@ -51,6 +51,7 @@ static history_item_s *data_obj = NULL;
static int listener_hsp = -1;
static event_pool events_buf[10];
static int buff_count = 0;
+static int lock_ref_count = 0;
GHashTable *app_list = NULL;
static GHashTable *pid_map = NULL;
@@ -215,8 +216,8 @@ static int bd_listener_set_battery_info()
else
data_obj->battery_plugtype = BD_BPLT_NONE;
- _DBG("battery_level = %d, battery_status = %d, battery_health = %d, \
- battery_plugtype = %d", data_obj->battery_level, data_obj->battery_status, \
+ _DBG("battery_level = %d, battery_status = %d, battery_health = %d, battery_plugtype = %d",
+ data_obj->battery_level, data_obj->battery_status, \
data_obj->battery_health, data_obj->battery_plugtype);
data_obj->battery_temperature = info.temperature;
@@ -771,15 +772,13 @@ static int bd_listener_set_power_lock_unlock_change_data(int lock, char *app_id)
_INFO("lock change - %d, app - %s", lock, app_id);
- static int prev_wakeup = 0;
static int lock_hsp = 0;
+ static int prev_lock = -1;
- if (prev_wakeup == lock) {
- _DBG("prev & current wakeups are same");
+ if (prev_lock == lock) {
+ _WARN("same lock event");
BM_FREE(app_id);
return 1;
- } else {
- prev_wakeup = lock;
}
if (lock) {
@@ -801,7 +800,6 @@ static int bd_listener_set_power_lock_unlock_change_data(int lock, char *app_id)
_DBG("wakelock tag created, string_info - [%s]",
data_obj->wakelock_tag->string_info->str);
- BM_FREE(app_id);
} else {
_ERR(" object creation failure ");
BM_FREE(app_id);
@@ -816,6 +814,10 @@ static int bd_listener_set_power_lock_unlock_change_data(int lock, char *app_id)
data_obj->state_1 &= ~(ST1_WAKE_LOCK_FLAG);
}
+ prev_lock = lock;
+
+ BM_FREE(app_id);
+
EXIT;
return 0;
}
@@ -1090,10 +1092,12 @@ static void bd_listener_create_event_data(int type, int val, char *app)
_DBG("Event occur too early, not updating battery information ");
}
- if (type == LISTEN_BATTERY_CAPACITY_CHANGE && prev_battery_level == data_obj->battery_level)
+ if (type == LISTEN_BATTERY_CAPACITY_CHANGE && prev_battery_level == data_obj->battery_level) {
+ _DBG("same battery-levels, returning");
return;
- else
+ } else {
prev_battery_level = data_obj->battery_level;
+ }
if (data_obj->event_tag && type != LISTEN_APP_STATUS) {
data_obj->event_tag->uid = 1000;
@@ -1122,6 +1126,8 @@ static void bd_listener_create_event_data(int type, int val, char *app)
return;
}
+ _DBG("SUCCESS - create event");
+
EXIT;
return;
}
@@ -1601,14 +1607,20 @@ static void _bd_listener_charging_status_change(keynode_t *key, void* data)
{
ENTER;
- int charging = 0;
+ int curr_state = 0;
+ static int prev_state = -1;
- vconf_get_int(VCONFKEY_SYSMAN_CHARGER_STATUS, &charging);
+ vconf_get_int(VCONFKEY_SYSMAN_CHARGER_STATUS, &curr_state);
- _INFO("device charging_status changed = %d ", charging);
+ _DBG("device charging_status changed = %d ", curr_state);
+
+ if (prev_state == curr_state) {
+ _WARN("same event received");
+ return;
+ }
/* get event object */
- event_pool *event = bd_listener_get_event_obj(LISTEN_CHARGING_STATUS_CHANGE, charging, NULL);
+ event_pool *event = bd_listener_get_event_obj(LISTEN_CHARGING_STATUS_CHANGE, curr_state, NULL);
if (event == NULL) {
_ERR("Failed to get event pool object");
return;
@@ -1617,6 +1629,8 @@ static void _bd_listener_charging_status_change(keynode_t *key, void* data)
/* create thread */
bd_create_producer_thread(event, "charging_status_change");
+ prev_state = curr_state;
+
EXIT;
return;
}
@@ -1745,84 +1759,90 @@ static void _bd_listener_notify_modem_power(TapiHandle *handle, const char *noti
return;
}
-static void _bd_listener_create_lock_event(char *lock_type, pid_t pid)
+static void _bd_listener_powerlock_signal_cb(GDBusConnection *conn, const gchar *sender, const gchar *path,
+ const gchar *iface, const gchar *signal, GVariant *params, gpointer user_data)
{
- int val;
- static int prev_lock = 0;
+ ENTER;
+
+ pid_t pid = -1;
+ char *lock_type = NULL;
+ unsigned int timeout;
char *pname = NULL;
- _INFO("lock [%s], pid [%d]", lock_type, pid);
+ g_variant_get(params, "(&sii)", &lock_type, &pid, &timeout);
+ BD_CHECK_VALIDITY_RETURN((pid > 0), {});
- if (g_strcmp0(lock_type, "lcdoff") == 0)
- val = 0;
- else if (g_strcmp0(lock_type, "lcddim") == 0)
- val = 1;
- else if (g_strcmp0(lock_type, "lcdon") == 0)
- val = 2;
- else {
- _DBG("different lock_type - [%s]", lock_type);
- return;
- }
+ _DBG("lock[%s], pid[%d], timeout[%d], ref_count[%d]", lock_type, pid, timeout, lock_ref_count);
- if (prev_lock == val) {
- _DBG("return due to same values");
- return;
- } else {
- prev_lock = val;
- }
+ if (lock_ref_count == 0) {
- bm_get_name_for_pid(pid, &pname);
+ bm_get_symlink_for_pid(pid, &pname);
- _DBG("received process name - [%s]", pname);
+ _DBG("creating wake-lock event, pid[%d], process[%s]", pid, pname);
- /* get event object */
- event_pool *event = bd_listener_get_event_obj(LISTEN_POWERLOCKUNLOCK_STATE, val, pname);
- if (event == NULL) {
- _ERR("Failed to get event pool object");
- BM_FREE(pname);
- return;
- }
+ /* get event object */
+ event_pool *event = bd_listener_get_event_obj(LISTEN_POWERLOCKUNLOCK_STATE, 1, pname);
+ if (event == NULL) {
+ _ERR("Failed to get event pool object");
+ BM_FREE(pname);
+ return;
+ }
- /* create thread */
- bd_create_producer_thread(event, "lock_event");
+ /* create thread */
+ bd_create_producer_thread(event, "lock_event");
+
+ ++lock_ref_count;
+
+ } else {
+ _DBG("lock acquired, ref_count[%d]", ++lock_ref_count);
+ }
EXIT;
return;
}
-static void _bd_listener_powerlock_signal_cb(GDBusConnection *conn, const gchar *sender, const gchar *path,
+static void _bd_listener_powerunlock_signal_cb(GDBusConnection *conn, const gchar *sender, const gchar *path,
const gchar *iface, const gchar *signal, GVariant *params, gpointer user_data)
{
ENTER;
- pid_t pid;
- char *lock_type;
+ pid_t pid = -1;
+ char *lock_type = NULL;
unsigned int timeout;
+ char *pname = NULL;
g_variant_get(params, "(&sii)", &lock_type, &pid, &timeout);
+ BD_CHECK_VALIDITY_RETURN((pid > 0), {});
- _INFO(" powerlock value changed =%s Pid=%d, timeout=%d", lock_type, pid, timeout);
+ _DBG("un-lock[%s], pid[%d], timeout[%d], ref_count[%d]", lock_type, pid, timeout, lock_ref_count);
- _bd_listener_create_lock_event(lock_type, pid);
-
- EXIT;
- return;
-}
+ if (lock_ref_count == 0) {
+ _ERR("improper wakelock, no event created");
+ return;
+ } else if (lock_ref_count > 0) {
+ --lock_ref_count;
+ _DBG("received unlock event, count[%d]", lock_ref_count);
+ }
-static void _bd_listener_powerunlock_signal_cb(GDBusConnection *conn, const gchar *sender, const gchar *path,
- const gchar *iface, const gchar *signal, GVariant *params, gpointer user_data)
-{
- ENTER;
+ if (lock_ref_count == 0) {
- pid_t pid;
- char *lock_type;
- unsigned int timeout;
+ bm_get_symlink_for_pid(pid, &pname);
- g_variant_get(params, "(&sii)", &lock_type, &pid, &timeout);
+ _DBG("creating wake-unlock event, pid[%d], process[%s]", pid, pname);
- _INFO(" powerUnlock value changed =%s Pid=%d, timeout=%d", lock_type, pid, timeout);
+ /* get event object */
+ event_pool *event = bd_listener_get_event_obj(LISTEN_POWERLOCKUNLOCK_STATE, 0, pname);
+ if (event == NULL) {
+ _ERR("Failed to get event pool object");
+ BM_FREE(pname);
+ return;
+ }
- _bd_listener_create_lock_event(lock_type, pid);
+ /* create thread */
+ bd_create_producer_thread(event, "lock_event");
+ } else {
+ _DBG("still holding lock, ref_count[%d]", lock_ref_count);
+ }
EXIT;
return;
diff --git a/src/bm_util.c b/src/bm_util.c
index 54a0341..3b30fab 100644
--- a/src/bm_util.c
+++ b/src/bm_util.c
@@ -15,16 +15,23 @@
*
*/
+#include <unistd.h>
#include <cynara-client.h>
#include <cynara-session.h>
#include <cynara-creds-gdbus.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/stat.h>
+
#include "bm_util.h"
#include "bm_common.h"
static cynara *p_cynara;
GDBusConnection* connection_obj = NULL;
+enum { PATH_BUFFER_SIZE = 64, BUFFERSIZE = 1024 };
+
GDBusErrorEntry bm_svc_errors[] = {
{BATTERY_MONITOR_ERROR_NONE, BATTERY_MONITOR_SVC_ERROR_PREFIX".NoError"},
{BATTERY_MONITOR_ERROR_OUT_OF_MEMORY, BATTERY_MONITOR_SVC_ERROR_PREFIX".OutOfMemory"},
@@ -369,7 +376,7 @@ void bd_get_focussed_app_id(char **app_name)
return;
}
-void bm_get_name_for_pid(pid_t pid, char **pname)
+void bm_get_symlink_for_pid(pid_t pid, char **pname)
{
_INFO("pid = [%d]", pid);
@@ -378,35 +385,37 @@ void bm_get_name_for_pid(pid_t pid, char **pname)
app_manager_get_app_id(pid, &app_id);
if (app_id == NULL) { /*it might be a daemon, ex-/usr/bin/batterymonitor-svcd*/
- char buf[PATH_MAX];
- int fd, r;
-
- snprintf(buf, PATH_MAX, "/proc/%d/comm", pid);
-
- if (access(buf, F_OK) != 0) {
- _ERR("maybe pid no more exists");
+ char path[PATH_BUFFER_SIZE], buf[BUFFERSIZE];
+ int path_len = 0, lst = 0;
+ ssize_t len = -1;
+ struct stat st_buf;
+
+ /* prepare pid-exe path */
+ path_len = snprintf(path, PATH_BUFFER_SIZE, "/proc/%d/exe", pid);
+ if (path_len < 1 || path_len >= PATH_BUFFER_SIZE) {
+ _ERR("insufficient buffer size");
return;
}
- fd = open(buf, O_RDONLY);
- if (fd < 0) {
- _ERR("process(%d) does not exist now.", pid);
+ _DBG("exe path - [%s]", path);
+
+ /* check availability */
+ lst = lstat(path, &st_buf);
+ if (lst != 0 || !S_ISLNK(st_buf.st_mode)) {
+ _ERR("sym-link un-available");
return;
}
- r = read(fd, buf, PATH_MAX);
- if ((r > 0) && (r < PATH_MAX)) {
- buf[r-1] = '\0';
+ /* read symbolic link */
+ len = readlink(path, buf, sizeof(buf)-1);
+ if (len != -1) {
+ buf[len] = '\0';
} else {
- _ERR("read error");
- if (close(fd) == -1)
- _ERR("fd close error");
+ _ERR("read bytes - [%d], error [%s]", len, strerror(errno));
return;
}
- if (close(fd) == -1) {
- _ERR("fd close error");
- }
+ _DBG("read sym-link - [%s]", buf);
app_id = strdup(buf);
}