wakelock events implementation updated 14/251514/1 accepted/tizen/unified/20210122.084703 submit/tizen/20210121.113303
authorKamaljeet Chauhan <kamal.jc@samsung.com>
Thu, 14 Jan 2021 11:52:02 +0000 (17:22 +0530)
committerKamaljeet Chauhan <kamal.jc@samsung.com>
Thu, 14 Jan 2021 11:52:02 +0000 (17:22 +0530)
Change-Id: Ic9fb97f7e2261437e67dc86a92239b3b399ab558
Signed-off-by: Kamaljeet Chauhan <kamal.jc@samsung.com>
include/bm_listeners.h
include/bm_util.h
src/battery_dump/bm_listeners.c
src/bm_util.c

index e337232..9149aa9 100644 (file)
@@ -15,9 +15,6 @@
  *
  */
 
-
-
-
 #include <wifi-manager.h>
 #include <bluetooth.h>
 #include <device/callback.h>
 #include <device/display.h>
 #include <pthread.h>
 
-#include "bm_dbg.h"
 #include "bm_plugin_interface.h"
 #include "bd_private.h"
 
-#define BATTERY_INFO_DELAY 1
+#define BATTERY_INFO_DELAY 1000
 #define MAX_BUFF 1
 #define        LISTEN_BT_STATE 0
 #define        LISTEN_BT_CONNECTION_STATE 1
index dd88ea6..985c981 100644 (file)
@@ -55,6 +55,8 @@ GVariant* bm_marshal_serialized_data(const bm_total_consumption_h data);
 
 const char *bm_get_resource_id_string(gint resource_id);
 
+void bm_get_name_for_pid(pid_t pid, char **pname);
+
 int bm_set_dbus_connection_obj(GDBusConnection* conn);
 
 GDBusConnection* bm_get_dbus_connection_obj(void);
index 6236433..63c796e 100644 (file)
@@ -34,6 +34,11 @@ typedef struct ApplicationInfo {
        int app_state;
 } appInfo;
 
+typedef struct WakelockInfo {
+       int hsp_info;
+       int wake_state;
+} wakeInfo;
+
 wifi_manager_h wifi = NULL;
 struct timeval prev_event_time;
 
@@ -52,10 +57,25 @@ static int listener_hsp = -1;
 static event_pool events_buf[10];
 static int buff_count = 0;
 static int lock_ref_count = 0;
+static int lock_hsp = 0;
+static int bt_hsp = 0;
+static int bt_scan_hsp = 0;
+static int wifi_hsp = 0;
+static int wifi_scan_hsp = 0;
+static int wifi_connected_hsp = 0;
+static int display_hsp = 0;
+static int gps_hsp = 0;
+static int app_hsp = 0;
+static int wakeup_hsp = 0;
+static int modem_hsp = 0;
+static int reset_val = 0;
+
 
 GHashTable *app_list = NULL;
+GHashTable *wakelock_list = NULL;
 static GHashTable *pid_map = NULL;
 
+
 static void bd_set_free_data_object(void)
 {
        BD_CHECK_VALIDITY_RETURN((data_obj != NULL), {});
@@ -157,12 +177,14 @@ static int bd_listener_set_appId_info(char *app_id)
 
        data_obj->event_tag->uid = 1000;
 
-       data_obj->event_tag->string_info = g_string_new(app_id);
+       data_obj->event_tag->string_info = g_string_sized_new(7);
 
-       BD_CHECK_FOR_VALIDITY((data_obj->event_tag->string_info != NULL), {},
-                                               BATTERY_MONITOR_ERROR_OUT_OF_MEMORY);
+       if (!data_obj->event_tag->string_info) {
+               _ERR("memory allocation  failed ");
+               return 1;
+       }
 
-       _DBG("set string_info - [%s]", data_obj->event_tag->string_info->str);
+       g_string_append_printf(data_obj->event_tag->string_info, "%s", app_id);
 
        EXIT;
        return 0;
@@ -216,8 +238,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;
@@ -237,7 +259,6 @@ static void bd_listener_set_bt_adapter_state_change_data(int adapter_state)
 {
        ENTER;
 
-       static int bt_hsp = 0;
        int bt_state = -1;
 
        if (adapter_state == BT_ADAPTER_ENABLED)
@@ -290,8 +311,7 @@ static void bd_listener_set_bt_device_discovery_state_change_data(int discovery_
 
        _INFO("discovery_state = %d", discovery_state);
 
-       static int bt_scan_hsp = 0, bt_flag = 0;
-
+       static int bt_flag = 0;
        if (data_obj) {
                switch (discovery_state) {
                case BT_ADAPTER_DEVICE_DISCOVERY_STARTED:
@@ -390,8 +410,6 @@ static void bd_listener_set_wifi_device_state_data(int state)
 
        (state == WIFI_MANAGER_DEVICE_STATE_ACTIVATED) ? _INFO("Activated") : _INFO("Deactivated");
 
-       static int wifi_hsp = 0;
-
        if (data_obj) {
                if (state == WIFI_MANAGER_DEVICE_STATE_ACTIVATED) {
                        data_obj->event_code = ET_NONE;
@@ -435,7 +453,7 @@ static void bd_listener_set_wifi_scan_change_data(int state)
 
        _INFO("scan state = %d", state);
 
-       static int wifi_flag = 0, wifi_scan_hsp = 0;
+       static int wifi_flag = 0;
 
        if (data_obj) {
                if (state == WIFI_MANAGER_SCAN_STATE_SCANNING) {
@@ -484,8 +502,6 @@ static void bd_listener_set_wifi_connection_state_change_data(int state)
 
        _INFO("connection state = %d", state);
 
-       static int wifi_connected_hsp = 0;
-
        if (data_obj) {
                switch (state) {
                case WIFI_MANAGER_CONNECTION_STATE_CONNECTED:
@@ -532,8 +548,6 @@ static void bd_listener_set_device_display_change_data(int value)
 
        _INFO("device display state = %d", value);
 
-       static int display_hsp = 0;
-
        switch (value) {
        case DISPLAY_STATE_NORMAL:
                _DBG("Display on");
@@ -665,8 +679,6 @@ static void bd_listener_set_sleep_wakeup_change_data(int val)
 
        _INFO("sleep wakeup change = %d", val);
 
-       static int wakeup_hsp = 0;
-
        if (val) {
                data_obj->event_code = ET_NONE;
                data_obj->event_tag = NULL;
@@ -724,8 +736,6 @@ static void bd_listener_set_location_change_data(int gps)
 
        _INFO("location change = %d", gps);
 
-       static int gps_hsp = 0;
-
        if (data_obj) {
                if (gps) {
                        data_obj->event_code = ET_NONE;
@@ -772,54 +782,190 @@ 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 lock_hsp = 0;
-       static int prev_lock = -1;
-
-       if (prev_lock == lock) {
-               _WARN("same lock event");
-               BM_FREE(app_id);
-               return 1;
-       }
+       int error_code = 0;
+       void *prv_data = NULL, *prv_app_id = NULL;
 
        if (lock) {
                data_obj->event_code = ET_NONE;
                data_obj->event_tag = NULL;
                data_obj->wakelock_tag = NULL;
 
+               lock_hsp = listener_hsp + 1;
+
+               /* check if exists in hash-table */
+               if (g_hash_table_lookup_extended(wakelock_list, app_id, &prv_app_id, &prv_data) == true) {
+                       wakeInfo *prevInfo = (wakeInfo *)prv_data;
+
+                       /*check if an app try to lock again without sending unlock event*/
+                       if (prevInfo->wake_state) {
+                               error_code = 1;
+                               _ERR(" two consecutive lock events for same app_id");
+                               goto out;
+                       }
+                       prevInfo->hsp_info = lock_hsp;
+                       prevInfo->wake_state = lock;
+
+                       _DBG(" sp index for this app id is = %d and lock_hsp= %d",
+                                               prevInfo->hsp_info, lock_hsp);
+               }  else {
+                       /* first time for app_id , insert into hash-table */
+                       wakeInfo *info = (wakeInfo *)calloc(1, sizeof(wakeInfo));
+                       if (info == NULL) {
+                               _ERR("memory allocation failed");
+                               error_code = 1;
+                               lock_ref_count++;
+                               goto out;
+                       }
+                       info->hsp_info = lock_hsp;
+                       info->wake_state = lock;
+
+                       _DBG("inserting in table - [%s], hsp-info = %d, wake_state= %d", app_id, info->hsp_info, info->wake_state);
+                       g_hash_table_insert(wakelock_list, g_strdup(app_id), info);
+               }
+               if (reset_val) {
+                       /* Check if Reset is Enabled, set EWL event */
+                       data_obj->event_code |= ET_WAKE_LOCK;
+                       data_obj->event_code |= ET_FLAG_START;
+                       data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
+                       if (data_obj->event_tag) {
+                               data_obj->event_tag->sp_idx = lock_hsp;
+                               if (bd_listener_set_appId_info(app_id)) {
+                                       error_code = 1;
+                                       lock_ref_count++;
+                                       _ERR("bd_listener_set_appId_info failure ");
+                                       BM_FREE(data_obj->event_tag);
+                                       goto out;
+                               }
+                       } else {
+                               _ERR(" object creation failure ");
+                               error_code = 1;
+                               lock_ref_count++;
+                               goto out;
+                       }
+               } else {
+                       /* If Reset is Disabled, Don't set EWL event*/
+                       if (lock_ref_count > 0) {
+                               error_code = 1;
+                               _DBG(" Reset Disabled no need to send event ");
+                               lock_ref_count++;
+                               goto out;
+                       }
+
+               }
                data_obj->wakelock_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
                if (data_obj->wakelock_tag) {
-
-                       lock_hsp = ++listener_hsp;
                        data_obj->wakelock_tag->sp_idx = lock_hsp;
                        data_obj->wakelock_tag->uid = 1000;
-
                        data_obj->wakelock_tag->string_info = g_string_new(app_id);
-                       BD_CHECK_FOR_VALIDITY((data_obj->wakelock_tag->string_info != NULL), {},
-                                                               BATTERY_MONITOR_ERROR_OUT_OF_MEMORY);
+                       BD_CHECK_FOR_VALIDITY((data_obj->wakelock_tag->string_info != NULL), { BM_FREE(app_id); BM_FREE(data_obj->wakelock_tag); },
+                                               BATTERY_MONITOR_ERROR_OUT_OF_MEMORY);
 
                        _DBG("wakelock tag created, string_info - [%s]",
-                                               data_obj->wakelock_tag->string_info->str);
-
+                       data_obj->wakelock_tag->string_info->str);
                } else {
-                       _ERR(" object creation failure ");
+                       _ERR("wakelock tag object creation failure ");
                        BM_FREE(app_id);
+                       lock_ref_count++;
                        return 1;
                }
-               data_obj->state_1 |= ST1_WAKE_LOCK_FLAG;
+
+               /* Set wake lock state*/
+               if (lock_ref_count == 0) {
+                       _DBG(" ref_count = 0, set the wake lock state ");
+                       data_obj->state_1 |= ST1_WAKE_LOCK_FLAG;
+               }
+
+               lock_ref_count++;
+               listener_hsp++;
+               BM_FREE(app_id);
+               return 0;
        } else {
                data_obj->event_code = ET_NONE;
-               data_obj->wakelock_tag = NULL;
                data_obj->event_tag = NULL;
-               //WAKE LOCK TAG INFORMATION NOT REQ. AT UNSET.
-               data_obj->state_1 &= ~(ST1_WAKE_LOCK_FLAG);
+               data_obj->wakelock_tag = NULL; //WAKE LOCK TAG INFORMATION NOT REQ. AT UNSET.
+
+               /* Unlock before a lock should be ignored*/
+               if (lock_ref_count == 0) {
+                       error_code = 1;
+                       goto out;
+               }
+
+               if (lock_ref_count >= 1) {
+                       if (g_hash_table_lookup_extended(wakelock_list, app_id, &prv_app_id, &prv_data) == true) {
+                               wakeInfo *prevInfo = (wakeInfo *)prv_data;
+
+                               _DBG("app available in list - app_id[%s], prev_app_id[%s], wake_state[%d]",
+                                                       app_id, (char *)prv_app_id, prevInfo->wake_state);
+
+                               /* Check if an app try to Unlock without sending lock event*/
+                               if (prevInfo->wake_state == 0) {
+                                               error_code = 1;
+                                               _ERR(" two consecutive un-lock events for same app_id");
+                                               goto out;
+                               }
+
+                               if (prevInfo->wake_state == 1 && lock == 0) {
+                                       prevInfo->wake_state = lock; /* update new value for wake lock state */
+
+                                       /* Set -Ewl event if Reset is enabled*/
+                                       if (reset_val) {
+                                               data_obj->event_code = ET_NONE;
+                                               data_obj->event_code |= ET_WAKE_LOCK;
+                                               data_obj->event_code |= ET_FLAG_FINISH;
+                                               data_obj->event_tag = NULL;
+
+                                               data_obj->event_tag = (history_tag_s *)calloc(1, sizeof(history_tag_s));
+                                               if (data_obj->event_tag) {
+                                                       lock_hsp = prevInfo->hsp_info;
+                                                       error_code = 0;
+                                                       data_obj->event_tag->sp_idx = lock_hsp;
+                                                       if (bd_listener_set_appId_info(app_id)) {
+                                                               error_code = 1;
+                                                               _ERR("set app id failure ");
+                                                               lock_ref_count--;
+                                                               BM_FREE(data_obj->event_tag);
+                                                               goto out;
+                                                       }
+                                               } else {
+                                                       _ERR(" data_obj->event_tag object creation fails ");
+                                                       error_code = 1;
+                                                       lock_ref_count--;
+                                                       goto out;
+                                               }
+                                       }
+                               } else {
+                                       _DBG("event-tag not created - prev_appid[%s], prev_state[%d], val[%d]",
+                                                       (char *)prv_app_id, prevInfo->wake_state, lock);
+                                       error_code = 1;
+                                       lock_ref_count--;
+                                       goto out;
+                               }
+                       } else {
+                               _DBG("application not available in list ");
+                               error_code = 1;
+                               goto out;
+                       }
+
+               }
+               if (lock_ref_count > 1 && reset_val == 0)
+                       error_code = 1;
+
+               /* Unset wake lock state */
+               if (lock_ref_count == 1) {
+                       _DBG(" unset the wake lock state ref_count ==1 ");
+                       data_obj->state_1 &= ~(ST1_WAKE_LOCK_FLAG);
+               }
+               lock_ref_count--;
        }
 
-       prev_lock = lock;
 
-       BM_FREE(app_id);
+out:
+       if (app_id)
+               g_free(app_id);
 
+       _DBG(" Error code =%d,  lock_ref_count = %d ", error_code, lock_ref_count);
        EXIT;
-       return 0;
+       return error_code;
 }
 
 static int bd_listener_set_app_status_change_data(int val, char *app_id)
@@ -908,8 +1054,7 @@ static int bd_listener_set_app_status_change_data(int val, char *app_id)
                                /* event tag is created only when app transits from foreground to either
                                 * background or terminate state. No event tag is created when transition
                                 * is from background state to terminate state */
-                               if (prevInfo->app_state == 1 && (val == 0 || val == -1))
-                               {
+                               if (prevInfo->app_state == 1 && (val == 0 || val == -1)) {
                                        prevInfo->app_state = val; /* update new value for app_id */
 
                                        data_obj->event_code = ET_NONE;
@@ -957,8 +1102,6 @@ static void bd_listener_set_modem_power_state_change_data(int state)
 
        _INFO("modem state = %d", state);
 
-       static int modem_hsp = 0;
-
        if (data_obj && state == 0) { /* ON */
                data_obj->event_code = ET_NONE;
                data_obj->event_code |= ET_ACTIVE;
@@ -1077,11 +1220,11 @@ static void bd_listener_create_event_data(int type, int val, char *app)
        gettimeofday(&tv, NULL);
        data_obj->time_s = ((long long)tv.tv_sec * 1000) + ((long long)tv.tv_usec / 1000);
 
-       double time_taken;
-       time_taken = (tv.tv_sec - prev_event_time.tv_sec) * 1000000;
-       time_taken = (time_taken + (tv.tv_usec - prev_event_time.tv_usec)) * 0.000001;
+       long long time_taken = 0;
+       time_taken = ((long long)tv.tv_sec * 1000) + ((long long)tv.tv_usec / 1000);
+       time_taken = time_taken - (((long long)prev_event_time.tv_sec * 1000) + ((long long)prev_event_time.tv_usec / 1000));
 
-       _DBG("time_taken = %lf ", time_taken);
+       _DBG("time_taken = %lld ", time_taken);
 
        if (time_taken >= BATTERY_INFO_DELAY) {
                if (bd_listener_set_battery_info() != DEVICE_ERROR_NONE)
@@ -1099,7 +1242,7 @@ static void bd_listener_create_event_data(int type, int val, char *app)
                prev_battery_level = data_obj->battery_level;
        }
 
-       if (data_obj->event_tag && type != LISTEN_APP_STATUS) {
+       if (data_obj->event_tag && type != LISTEN_APP_STATUS && type != LISTEN_POWERLOCKUNLOCK_STATE) {
                data_obj->event_tag->uid = 1000;
 
                data_obj->event_tag->string_info = g_string_new("Tizen");
@@ -1112,9 +1255,12 @@ static void bd_listener_create_event_data(int type, int val, char *app)
                        data_obj->event_tag->string_info->str, data_obj->event_tag->sp_idx);
        }
 
-       if (type == LISTEN_POWERLOCKUNLOCK_STATE)
-               data_obj->event_tag = NULL;
-       else
+       if (type == LISTEN_POWERLOCKUNLOCK_STATE) {
+               if (reset_val)
+                       _DBG(" Powerlockunlock in Reset Enabled state");
+               else
+                       data_obj->event_tag = NULL;
+       } else
                data_obj->wakelock_tag = NULL;
 
        if (type != LISTEN_SLEEP_WAKEUP_STATE)
@@ -1772,31 +1918,22 @@ static void _bd_listener_powerlock_signal_cb(GDBusConnection *conn, const gchar
        g_variant_get(params, "(&sii)", &lock_type, &pid, &timeout);
        BD_CHECK_VALIDITY_RETURN((pid > 0), {});
 
-       _DBG("lock[%s], pid[%d], timeout[%d], ref_count[%d]", lock_type, pid, timeout, lock_ref_count);
-
-       if (lock_ref_count == 0) {
+       _DBG("lock[%s], pid[%d], timeout[%d]", lock_type, pid, timeout);
+       bm_get_symlink_for_pid(pid, &pname);
 
-               bm_get_symlink_for_pid(pid, &pname);
+       _DBG("creating wake-lock event, pid[%d], process[%s]", pid, 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, 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");
-
-               ++lock_ref_count;
-
-       } else {
-               _DBG("lock acquired, ref_count[%d]", ++lock_ref_count);
+       /* 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");
+
        EXIT;
        return;
 }
@@ -1814,35 +1951,21 @@ static void _bd_listener_powerunlock_signal_cb(GDBusConnection *conn, const gcha
        g_variant_get(params, "(&sii)", &lock_type, &pid, &timeout);
        BD_CHECK_VALIDITY_RETURN((pid > 0), {});
 
-       _DBG("un-lock[%s], pid[%d], timeout[%d], ref_count[%d]", lock_type, pid, timeout, lock_ref_count);
+       _DBG("un-lock[%s], pid[%d], timeout[%d]", lock_type, pid, timeout);
+       bm_get_symlink_for_pid(pid, &pname);
+
+       _DBG("creating wake-unlock event, pid[%d], process[%s]", pid, pname);
 
-       if (lock_ref_count == 0) {
-               _ERR("improper wakelock, no event created");
+       /* 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;
-       } else if (lock_ref_count > 0) {
-               --lock_ref_count;
-               _DBG("received unlock event, count[%d]", lock_ref_count);
        }
 
-       if (lock_ref_count == 0) {
-
-               bm_get_symlink_for_pid(pid, &pname);
-
-               _DBG("creating wake-unlock event, pid[%d], process[%s]", pid, pname);
-
-               /* 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;
-               }
-
-               /* create thread */
-               bd_create_producer_thread(event, "lock_event");
-       } else {
-               _DBG("still holding lock, ref_count[%d]", lock_ref_count);
-       }
+       /* create thread */
+       bd_create_producer_thread(event, "lock_event");
 
        EXIT;
        return;
@@ -2302,6 +2425,12 @@ static int bd_initialize_data_items()
                return BATTERY_MONITOR_ERROR_OUT_OF_MEMORY;
        }
 
+       /* wakeup-list hash table */
+       wakelock_list = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+       if (wakelock_list == NULL) {
+               _ERR("failed to create wakelock-list table");
+               return BATTERY_MONITOR_ERROR_OUT_OF_MEMORY;
+       }
        /* pid-app_id map */
        pid_map = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, g_free);
        if (pid_map == NULL) {
@@ -2341,17 +2470,16 @@ static int bm_start_recording_event()
        _DBG("History Recorder Started");
        listener_hsp = -1;
 
-       /*      Reinitialize the hsp variables
+       //      Reinitialize the hsp variables
 
        bt_hsp = 0; bt_scan_hsp = 0;
        wifi_hsp = 0; wifi_scan_hsp = 0; wifi_connected_hsp = 0;
        display_hsp = 0; gps_hsp = 0; lock_hsp = 0; app_hsp = 0;
        wakeup_hsp = 0; modem_hsp = 0; lock_ref_count = 0;
-       */
 
        app_list = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
 
-//     wakelock_list = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+       wakelock_list = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
 
        EXIT;
        return 0;
@@ -2383,9 +2511,9 @@ static int bm_stop_recording_event()
 
        if (app_list)
                g_hash_table_destroy(app_list);
-       /*
+
        if (wakelock_list)
-               g_hash_table_destroy(wakelock_list);*/
+               g_hash_table_destroy(wakelock_list);
        EXIT;
        return BATTERY_MONITOR_ERROR_NONE;
 }
@@ -2412,7 +2540,7 @@ int bm_reset_event_listener(int to_enable)
        if (to_enable)
                _DBG("is enabled");
 
-//     reset_val = to_enable;
+       reset_val = to_enable;
 
        EXIT;
        return ret;
@@ -2438,8 +2566,7 @@ int bd_initialize_listeners(void)
                _ERR("pthread_attr_init failed");
                return BATTERY_MONITOR_ERROR_OUT_OF_MEMORY;
        }
-
-       if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0)
+               if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0)
                _ERR("pthread_attr_setdetachstate failed");
 
        /*  Wifi callbacks */
@@ -2554,6 +2681,11 @@ int bd_deinitialize_listeners()
                app_list = NULL;
        }
 
+       if (wakelock_list) {
+               g_hash_table_destroy(wakelock_list);
+               wakelock_list = NULL;
+       }
+
        if (pid_map) {
                g_hash_table_destroy(pid_map);
                pid_map = NULL;
index 0539c5e..ec01e36 100644 (file)
@@ -319,6 +319,59 @@ const char *bm_get_resource_id_string(gint resource_id)
        }
 }
 
+void bm_get_symlink_for_pid(pid_t pid, char **pname)
+{
+       _INFO("pid = [%d]", pid);
+
+       char *app_id = NULL;
+
+       app_manager_get_app_id(pid, &app_id);
+
+       if (app_id == NULL) { /*it might be a daemon, ex-/usr/bin/batterymonitor-svcd*/
+               char path[PATH_BUFFER_SIZE], buf[BUFFERSIZE];
+               int path_len = 0, lst = 0;
+               ssize_t len = -1;
+               struct stat st_buf;
+               char err_buf[128] = {0,};
+
+               /* 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;
+               }
+
+               _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;
+               }
+
+               /* read symbolic link */
+               len = readlink(path, buf, sizeof(buf)-1);
+               if (len != -1) {
+                       buf[len] = '\0';
+               } else {
+                       strerror_r(errno, err_buf, sizeof(err_buf));
+                       _ERR("read bytes - [%zd], error [%s]", len, err_buf);
+                       return;
+               }
+
+               _DBG("read sym-link - [%s]", buf);
+
+               app_id = strdup(buf);
+       }
+
+       *pname = app_id;
+
+       _INFO("pid - [%d], name - [%s]", pid, *pname);
+
+       return;
+}
+
 int bm_set_dbus_connection_obj(GDBusConnection* conn)
 {
        BM_CHECK_INPUT_PARAM(conn);
@@ -354,7 +407,7 @@ void bd_get_focussed_app_id(char **app_name)
        }
 
        return_val = app_context_get_app_id(app_context, &app_id);
-       if(return_val != APP_MANAGER_ERROR_NONE) {
+       if (return_val != APP_MANAGER_ERROR_NONE) {
                _ERR("failed to get app_id");
                app_context_destroy(app_context);
                return;
@@ -376,7 +429,7 @@ void bd_get_focussed_app_id(char **app_name)
        return;
 }
 
-void bm_get_symlink_for_pid(pid_t pid, char **pname)
+void bm_get_name_for_pid(pid_t pid, char **pname)
 {
        _INFO("pid = [%d]", pid);
 
@@ -385,38 +438,34 @@ void bm_get_symlink_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 path[PATH_BUFFER_SIZE], buf[BUFFERSIZE];
-               int path_len = 0, lst = 0;
-               ssize_t len = -1;
-               struct stat st_buf;
+               char buf[PATH_MAX];
+               int fd, r;
 
-               /* 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");
+               snprintf(buf, PATH_MAX, "/proc/%d/cmdline", pid);
+
+               if (access(buf, F_OK) != 0) {
+                       _ERR("maybe pid no more exists");
                        return;
                }
 
-               _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");
+               fd = open(buf, O_RDONLY);
+               if (fd < 0) {
+                       _ERR("process(%d) does not exist now.", pid);
                        return;
                }
 
-               /* read symbolic link */
-               len = readlink(path, buf, sizeof(buf)-1);
-               if (len != -1) {
-                       buf[len] = '\0';
+               r = read(fd, buf, PATH_MAX);
+               if ((r >= 0) && (r < PATH_MAX)) {
+                       buf[r] = '\0';
                } else {
-                       _ERR("read bytes -[%d], error [%s]", (int)len, strerror(errno));
+                       _ERR("read error");
+                       if (close(fd) == -1)
+                               _ERR("fd close error");
                        return;
                }
 
-               _DBG("read sym-link - [%s]", buf);
-
+               if (close(fd) == -1)
+                       _ERR("fd close error");
                app_id = strdup(buf);
        }