Fix a svace issue for negative code error
[platform/core/connectivity/stc-manager.git] / plugin / procfs / stc-plugin-procfs.c
index 28c5c9f..9538a61 100755 (executable)
 #include <glib.h>
 
 #include "stc-plugin-procfs.h"
-#include "stc-monitor.h"
+#include "helper-net-cls.h"
 #include "helper-procfs.h"
+#include "stc-manager-plugin-monitor.h"
+#include "stc-manager-plugin-exception.h"
 
 //LCOV_EXCL_START
 typedef struct {
@@ -61,7 +63,6 @@ static int nl_connector_sock = -1;
 static guint nl_connector_gsource_id = 0;
 static GTree *proc_tree;
 
-
 static gboolean __process_nl_connector_message(GIOChannel *source,
                                               GIOCondition condition,
                                               gpointer user_data);
@@ -102,13 +103,14 @@ static proc_value_s * __proc_tree_lookup(const proc_key_s *key)
        return lookup;
 }
 
+/*
 static gboolean __proc_tree_foreach_print(gpointer key, gpointer value,
                                          gpointer data)
 {
        proc_key_s *proc_key = (proc_key_s *)key;
        proc_value_s *proc_value = (proc_value_s *)value;
 
-       STC_LOGD("Proc pid [\033[1;33m%d\033[0;m] ppid [\033[1;35m%s\033[0;m] "
+       STC_LOGD("Proc pid [\033[1;33m%d\033[0;m] ppid [%s] "
                "cmdline [\033[0;34m%s\033[0;m]", proc_key->pid,
                proc_value->status[PROC_STATUS_PPID], proc_value->cmdline);
 
@@ -119,6 +121,7 @@ static void __proc_tree_printall(void)
 {
        g_tree_foreach(proc_tree, __proc_tree_foreach_print, NULL);
 }
+*/
 
 static proc_value_s * __proc_tree_find_parent(proc_value_s *value)
 {
@@ -133,10 +136,10 @@ static proc_value_s * __proc_tree_find_parent(proc_value_s *value)
                        parent = lookup;
        } while (lookup);
 
-       if (STC_DEBUG_LOG) {
+       if (STC_STAT_LOG) {
                if (parent != NULL)
-                       STC_LOGD("\033[0;35mPARENT\033[0;m: tgid[\033[1;33m%s\033[0;m] pid[%s] "
-                               "ppid[\033[1;35m%s\033[0;m] cmdline[\033[0;34m%s\033[0;m] name[%s]",
+                       STC_LOGD("\033[0;35mPARENT\033[0;m: tgid[\033[1;33m%s\033[0;m] "
+                               "pid[%s] ppid[%s] cmdline[\033[0;34m%s\033[0;m] name[%s]",
                                parent->status[PROC_STATUS_TGID], parent->status[PROC_STATUS_PID],
                                parent->status[PROC_STATUS_PPID], parent->cmdline,
                                parent->status[PROC_STATUS_NAME]);
@@ -145,8 +148,7 @@ static proc_value_s * __proc_tree_find_parent(proc_value_s *value)
        return parent;
 }
 
-static void __proc_tree_add(proc_key_s *key,
-                           proc_value_s *value)
+static void __proc_tree_add(proc_key_s *key, proc_value_s *value)
 {
        proc_value_s *lookup;
        proc_value_s *parent;
@@ -156,47 +158,63 @@ static void __proc_tree_add(proc_key_s *key,
                return;
        }
 
+       if (key == NULL || value == NULL) {
+               if (STC_STAT_LOG)
+                       STC_LOGE("invalid parameters");
+               return;
+       }
+
        lookup = g_tree_lookup(proc_tree, key);
-       if (lookup) {
-               if (STC_DEBUG_LOG)
-                       STC_LOGD("LOOKUP: tgid[\033[1;33m%s\033[0;m] pid[%s] ppid[\033[1;35m%s\033[0;m] "
-                               "cmdline[\033[0;34m%s\033[0;m] name[%s]", lookup->status[PROC_STATUS_TGID],
-                               lookup->status[PROC_STATUS_PID], lookup->status[PROC_STATUS_PPID],
-                               lookup->cmdline, lookup->status[PROC_STATUS_NAME]);
+       if (lookup)
+               return;
+
+       proc_key_s *proc_key = MALLOC0(proc_key_s, 1);
+       if (proc_key == NULL) {
+               STC_LOGE("memory allocation failed");
                return;
        }
 
-       STC_LOGD("cmdline [%s] pid[%s] ppid[%s]", value->cmdline,
-               value->status[PROC_STATUS_PID], value->status[PROC_STATUS_PPID]);
+       proc_value_s *proc_value = MALLOC0(proc_value_s, 1);
+       if (proc_value == NULL) {
+               STC_LOGE("memory allocation failed");
+               FREE(proc_key);
+               return;
+       }
 
-       g_tree_insert(proc_tree, key, value);
+       memcpy(proc_key, key, sizeof(proc_key_s));
+       memcpy(proc_value, value, sizeof(proc_value_s));
 
-       if (STC_DEBUG_LOG)
-               __proc_tree_printall();
+       g_tree_insert(proc_tree, proc_key, proc_value);
 
-       parent = __proc_tree_find_parent(value);
+       /*
+       __proc_tree_printall();
+       */
+
+       parent = __proc_tree_find_parent(proc_value);
        if (parent != NULL)
-               stc_plugin_procfs_status_changed(STC_CMD_SET_SERVICE_LAUNCHED, key->pid,
+               stc_plugin_procfs_status_changed(STC_CMD_SET_SERVICE_LAUNCHED, proc_key->pid,
                        parent->cmdline, parent->cmdline, STC_APP_TYPE_SERVICE);
        else
-               stc_plugin_procfs_status_changed(STC_CMD_SET_SERVICE_LAUNCHED, key->pid,
-                       value->cmdline, value->cmdline, STC_APP_TYPE_SERVICE);
+               stc_plugin_procfs_status_changed(STC_CMD_SET_SERVICE_LAUNCHED, proc_key->pid,
+                       proc_value->cmdline, proc_value->cmdline, STC_APP_TYPE_SERVICE);
 }
 
-static void __proc_tree_remove(const proc_key_s *key)
+static void __proc_tree_remove(const proc_key_s *key,
+                                               const proc_value_s *value)
 {
        if (proc_tree == NULL) {
                STC_LOGE("tree is null");
                return;
        }
 
-       stc_plugin_procfs_status_changed(STC_CMD_SET_TERMINATED, key->pid, NULL,
-                                      NULL, STC_APP_TYPE_NONE);
+       stc_plugin_procfs_status_changed(STC_CMD_SET_TERMINATED, key->pid,
+                       value->cmdline, value->cmdline, STC_APP_TYPE_NONE);
 
        g_tree_remove(proc_tree, key);
 
-       if (STC_DEBUG_LOG)
-               __proc_tree_printall();
+       /*
+       __proc_tree_printall();
+       */
 }
 
 static gboolean __check_excn(char *cmdline)
@@ -206,7 +224,7 @@ static gboolean __check_excn(char *cmdline)
        if (cmdline[0] == '(')
                return TRUE;
 
-       ret = stc_monitor_check_excn_by_cmdline(cmdline);
+       ret = stc_plugin_check_exception_by_cmdline(cmdline);
        if (ret == STC_ERROR_UNINITIALIZED ||
                ret == STC_ERROR_NO_DATA)
                return FALSE;
@@ -277,48 +295,36 @@ static void __process_event_fork(int tgid, int pid)
        char cmdline[PROC_NAME_MAX] = {0, };
        char status[PROC_STATUS_CNT][PROC_BUF_MAX];
 
+       /* TODO: Add newly created thread to the process tasks */
+       if (tgid != pid)
+               return;
+
        memset(status, 0x0, sizeof(status));
 
        if (STC_ERROR_NONE == proc_get_cmdline(pid, cmdline) &&
            STC_ERROR_NONE == proc_get_status(pid, status)) {
 
-               if (__check_excn(cmdline)) {
-                       if (STC_DEBUG_LOG)
-                               STC_LOGD("[%s] monitoring is excepted", cmdline);
+               if (__check_excn(cmdline))
                        return;
-               }
 
                unsigned int i;
-               proc_key_s *key;
-               proc_value_s *value;
-
-               key = MALLOC0(proc_key_s, 1);
-               if (key == NULL) {
-                       STC_LOGE("memory allocation failed");
-                       return;
-               }
+               proc_key_s key;
+               proc_value_s value;
 
-               value = MALLOC0(proc_value_s, 1);
-               if (value == NULL) {
-                       STC_LOGE("memory allocation failed");
-                       FREE(key);
-                       return;
-               }
+               memset(&key, 0x0, sizeof(proc_key_s));
+               memset(&value, 0x0, sizeof(proc_value_s));
 
-               key->pid = tgid;
+               key.pid = tgid;
                for (i = 0; i < PROC_STATUS_CNT; ++i)
-                       g_strlcpy(value->status[i], status[i], sizeof(value->status[i]));
-               g_strlcpy(value->cmdline, cmdline, sizeof(value->cmdline));
-
-               if (STC_DEBUG_LOG) {
-                       STC_LOGD("\033[1;34mFORK\033[0;m: tgid[\033[1;33m%d\033[0;m] ppid=[\033[1;35m%s\033[0;m] "
-                               "cmdline[\033[0;34m%s\033[0;m] pid[%d]", tgid, status[PROC_STATUS_PPID], cmdline, pid);
-                       STC_LOGD("STATUS: tgid[%s] pid[%s] ppid[%s] name[%s] state[%s] tracerpid[%s]",
-                               status[PROC_STATUS_TGID], status[PROC_STATUS_PID], status[PROC_STATUS_PPID],
-                               status[PROC_STATUS_NAME], status[PROC_STATUS_STATE], status[PROC_STATUS_TRACERPID]);
-               }
+                       g_strlcpy(value.status[i], status[i], sizeof(value.status[i]));
+               g_strlcpy(value.cmdline, cmdline, sizeof(value.cmdline));
+
+               if (STC_STAT_LOG)
+                       STC_LOGD("\033[1;32mFORK\033[0;m: tgid[\033[1;33m%d\033[0;m] "
+                       "ppid=[%s] cmdline[\033[0;34m%s\033[0;m] pid[%d]",
+                       tgid, status[PROC_STATUS_PPID], cmdline, pid);
 
-               __proc_tree_add(key, value);
+               __proc_tree_add(&key, &value);
        }
 }
 
@@ -327,48 +333,37 @@ static void __process_event_exec(int tgid, int pid)
        char cmdline[PROC_NAME_MAX] = {0, };
        char status[PROC_STATUS_CNT][PROC_BUF_MAX];
 
+       /* TODO: Add newly created thread to the process tasks */
+       if (tgid != pid)
+               return;
+
        memset(status, 0x0, sizeof(status));
 
        if (STC_ERROR_NONE == proc_get_cmdline(pid, cmdline) &&
            STC_ERROR_NONE == proc_get_status(pid, status)) {
 
-               if (__check_excn(cmdline)) {
-                       if (STC_DEBUG_LOG)
-                               STC_LOGD("[%s] monitoring is excepted", cmdline);
+               if (__check_excn(cmdline))
                        return;
-               }
 
                unsigned int i;
-               proc_key_s *key;
-               proc_value_s *value;
-
-               key = MALLOC0(proc_key_s, 1);
-               if (key == NULL) {
-                       STC_LOGE("memory allocation failed");
-                       return;
-               }
+               proc_key_s key;
+               proc_value_s value;
 
-               value = MALLOC0(proc_value_s, 1);
-               if (value == NULL) {
-                       STC_LOGE("memory allocation failed");
-                       FREE(key);
-                       return;
-               }
+               memset(&key, 0x0, sizeof(proc_key_s));
+               memset(&value, 0x0, sizeof(proc_value_s));
 
-               key->pid = tgid;
+               key.pid = tgid;
                for (i = 0; i < PROC_STATUS_CNT; ++i)
-                       g_strlcpy(value->status[i], status[i], sizeof(value->status[i]));
-               g_strlcpy(value->cmdline, cmdline, sizeof(value->cmdline));
-
-               if (STC_DEBUG_LOG) {
-                       STC_LOGD("\033[1;32mEXEC\033[0;m: tgid[\033[1;33m%d\033[0;m] ppid=[\033[1;35m%s\033[0;m] "
-                               "cmdline[\033[0;34m%s\033[0;m] pid[%d]", tgid, status[PROC_STATUS_PPID], cmdline, pid);
-                       STC_LOGD("STATUS: tgid[%s] pid[%s] ppid[%s] name[%s] state[%s] tracerpid[%s]",
-                               status[PROC_STATUS_TGID], status[PROC_STATUS_PID], status[PROC_STATUS_PPID],
-                               status[PROC_STATUS_NAME], status[PROC_STATUS_STATE], status[PROC_STATUS_TRACERPID]);
-               }
+                       g_strlcpy(value.status[i], status[i],
+                                 sizeof(value.status[i]));
+               g_strlcpy(value.cmdline, cmdline, sizeof(value.cmdline));
 
-               __proc_tree_add(key, value);
+               if (STC_STAT_LOG)
+                       STC_LOGD("\033[1;32mEXEC\033[0;m: tgid[\033[1;33m%d\033[0;m] "
+                       "ppid[%s] cmdline[\033[0;34m%s\033[0;m] pid[%d]",
+                       tgid, status[PROC_STATUS_PPID], cmdline, pid);
+
+               __proc_tree_add(&key, &value);
        }
 }
 
@@ -385,11 +380,12 @@ static void __process_event_exit(int tgid, int pid, int exit_code)
        if (lookup == NULL) /* unmonitored process */
                return;
 
-       if (STC_DEBUG_LOG)
+       if (STC_STAT_LOG)
                STC_LOGD("\033[1;31mEXIT\033[0;m: tgid[\033[1;33m%d\033[0;m] "
-                       "pid[%d] exitcode[\033[0;31m%d\033[0;m]", tgid, pid, exit_code);
+                       "cmdline[\033[0;34m%s\033[0;m] pid[%d] exitcode[%d]",
+                       tgid, lookup->cmdline, pid, exit_code);
 
-       __proc_tree_remove(&key);
+       __proc_tree_remove(&key, lookup);
 }
 
 static gboolean __process_nl_connector_message(GIOChannel *source,
@@ -405,7 +401,7 @@ static gboolean __process_nl_connector_message(GIOChannel *source,
                /* G_IO_ERR/G_IO_HUP/G_IO_NVAL received */
 
                STC_LOGE("Netlink Connector socket received G_IO event, closing"
-                        " socket. G_IO_ERR [%d], G_IO_HUP [%d], G_IO_NVAL [%s]",
+                        " socket. G_IO_ERR [%u], G_IO_HUP [%u], G_IO_NVAL [%u]",
                         (condition & G_IO_ERR), (condition & G_IO_HUP),
                         (condition & G_IO_NVAL));
                __reopen_nl_connector_sock();
@@ -436,7 +432,7 @@ static gboolean __process_nl_connector_message(GIOChannel *source,
                                     msg.proc_ev.event_data.exit.exit_code);
                break;
        default:
-               ; /* Do nothing */
+               break;
        }
 
        return TRUE;
@@ -451,7 +447,7 @@ static int __subscribe_proc_events(void)
 
        if (sock == -1) {
                __STC_LOG_FUNC_EXIT__;
-               return -1;
+               return STC_ERROR_INVALID_PARAMETER;
        }
 
        memset(&msg, 0, sizeof(nl_connector_msg_s));
@@ -470,11 +466,11 @@ static int __subscribe_proc_events(void)
        if (ret == -1) {
                STC_LOGE("Error sending netlink connector message");
                __STC_LOG_FUNC_EXIT__;
-               return -1;
+               return STC_ERROR_FAIL;
        }
 
        __STC_LOG_FUNC_EXIT__;
-       return 0;
+       return STC_ERROR_NONE;
 }
 
 static int __unsubscribe_proc_events(void)
@@ -486,7 +482,7 @@ static int __unsubscribe_proc_events(void)
 
        if (sock == -1) {
                __STC_LOG_FUNC_EXIT__;
-               return -1;
+               return STC_ERROR_INVALID_PARAMETER;
        }
 
        memset(&msg, 0, sizeof(nl_connector_msg_s));
@@ -505,16 +501,48 @@ static int __unsubscribe_proc_events(void)
        if (ret == -1) {
                STC_LOGE("Error sending netlink connector message");
                __STC_LOG_FUNC_EXIT__;
-               return -1;
+               return STC_ERROR_FAIL;
        }
 
        __STC_LOG_FUNC_EXIT__;
-       return 0;
+       return STC_ERROR_NONE;
+}
+
+static bool __process_pid_cb(pid_t pid, void *user_data)
+{
+       char cmdline[PROC_NAME_MAX] = {0, };
+       char status[PROC_STATUS_CNT][PROC_BUF_MAX];
+
+       memset(status, 0x0, sizeof(status));
+
+       if (STC_ERROR_NONE == proc_get_cmdline(pid, cmdline) &&
+           STC_ERROR_NONE == proc_get_status(pid, status)) {
+
+               if (__check_excn(cmdline))
+                       return true;
+
+               unsigned int i;
+               proc_key_s key;
+               proc_value_s value;
+
+               memset(&key, 0x0, sizeof(proc_key_s));
+               memset(&value, 0x0, sizeof(proc_value_s));
+
+               key.pid = pid;
+               for (i = 0; i < PROC_STATUS_CNT; ++i)
+                       g_strlcpy(value.status[i], status[i], sizeof(value.status[i]));
+               g_strlcpy(value.cmdline, cmdline, sizeof(value.cmdline));
+
+               __proc_tree_add(&key, &value);
+       }
+
+       return true;
 }
 
 int stc_plugin_procfs_initialize(void)
 {
        __STC_LOG_FUNC_ENTER__;
+       int ret = STC_ERROR_NONE;
 
        proc_tree = g_tree_new_full(__proc_tree_key_compare, NULL,
                                    __proc_tree_key_free,
@@ -523,137 +551,176 @@ int stc_plugin_procfs_initialize(void)
        /* TODO: Fill proc tree with current procfs state */
 
        __open_nl_connector_sock();
-       __subscribe_proc_events();
+       ret = __subscribe_proc_events();
+
        __STC_LOG_FUNC_EXIT__;
-       return STC_ERROR_NONE;
+       return ret;
 }
 
 int stc_plugin_procfs_deinitialize(void)
 {
        __STC_LOG_FUNC_ENTER__;
+       int ret = STC_ERROR_NONE;
 
        if (nl_connector_sock == -1) {
                STC_LOGD("socket already closed");
                return STC_ERROR_NONE;
        }
 
-       __unsubscribe_proc_events();
+       ret = __unsubscribe_proc_events();
        __close_nl_connector_sock();
 
        g_tree_destroy(proc_tree);
        proc_tree = NULL;
 
        __STC_LOG_FUNC_EXIT__;
+       return ret;
+}
+
+stc_error_e stc_plugin_procfs_load(void)
+{
+       __STC_LOG_FUNC_ENTER__;
+
+       proc_foreach_pid(__process_pid_cb, NULL);
+
+       __STC_LOG_FUNC_EXIT__;
        return STC_ERROR_NONE;
 }
 
 stc_error_e stc_plugin_procfs_status_changed(stc_cmd_type_e cmd,
-                               pid_t pid, const gchar *app_id, const gchar *pkg_id, stc_app_type_e app_type)
+                                               pid_t pid,
+                                               const gchar *app_id,
+                                               const gchar *pkg_id,
+                                               stc_app_type_e app_type)
 {
        stc_error_e ret = STC_ERROR_NONE;
 
-       if (pkg_id && app_id)
-               STC_LOGD("cmd [%d] pkgid [%s] appid [%s] pid[%d] type [%d]",
+       if ((pkg_id && app_id) && STC_STAT_LOG)
+               STC_LOGD("cmd[%d] pkgid[%s] appid[%s] pid[%d] type[%d]",
                        cmd, pkg_id, app_id, pid, app_type);
 
        switch (cmd) {
        case STC_CMD_SET_FOREGRD:
        {
-               stc_app_key_s app_key;
+               uint32_t fg_classid;
+               uint32_t bg_classid;
+               char *bg_app_id;
                stc_app_value_s app_value;
-               stc_process_key_s proc_key;
-               stc_process_value_s proc_value;
+               stc_proc_value_s proc_value;
 
-               memset(&app_key, 0, sizeof(stc_app_key_s));
                memset(&app_value, 0, sizeof(stc_app_value_s));
-               memset(&proc_key, 0, sizeof(stc_process_key_s));
-               memset(&proc_value, 0, sizeof(stc_process_value_s));
+               memset(&proc_value, 0, sizeof(stc_proc_value_s));
 
-               app_key.pkg_id = g_strdup(pkg_id);
-               app_key.app_id = g_strdup(app_id);
+               bg_app_id = g_strconcat(app_id, STC_BACKGROUND_APP_SUFFIX, NULL);
 
                app_value.type = app_type;
+               app_value.state = STC_APP_STATE_FOREGROUND;
                app_value.processes = NULL;
 
-               proc_key.pid = pid;
-
+               proc_value.pid = pid;
                proc_value.ground = STC_APP_STATE_FOREGROUND;
 
-               stc_monitor_application_add(app_key, app_value);
-               stc_monitor_process_add(app_key, proc_key, proc_value);
-               stc_monitor_process_update_ground(app_key, proc_key,
-                                                 STC_APP_STATE_FOREGROUND);
+               bg_classid = get_classid_by_app_id(bg_app_id, FALSE);
+               fg_classid = get_classid_by_app_id(app_id, TRUE);
+
+               stc_plugin_monitor_add_app(fg_classid, app_id, pkg_id, app_value);
 
-               FREE(app_key.pkg_id);
-               FREE(app_key.app_id);
+               stc_plugin_monitor_move_proc(bg_classid, fg_classid);
+
+               stc_plugin_monitor_add_proc(fg_classid, app_id, proc_value);
+               stc_plugin_monitor_update_proc_ground(fg_classid, app_id, proc_value);
+
+               FREE(bg_app_id);
                break;
        }
        case STC_CMD_SET_BACKGRD:
        {
-               stc_app_key_s app_key;
+               uint32_t bg_classid;
+               uint32_t fg_classid;
+               char *bg_app_id;
                stc_app_value_s app_value;
-               stc_process_key_s proc_key;
-               stc_process_value_s proc_value;
+               stc_proc_value_s proc_value;
 
-               memset(&app_key, 0, sizeof(stc_app_key_s));
                memset(&app_value, 0, sizeof(stc_app_value_s));
-               memset(&proc_key, 0, sizeof(stc_process_key_s));
-               memset(&proc_value, 0, sizeof(stc_process_value_s));
+               memset(&proc_value, 0, sizeof(stc_proc_value_s));
 
-               app_key.pkg_id = g_strdup(pkg_id);
-               app_key.app_id = g_strconcat(app_id, STC_BACKGROUND_APP_SUFFIX,
-                                            NULL);
+               bg_app_id = g_strconcat(app_id, STC_BACKGROUND_APP_SUFFIX, NULL);
 
                app_value.type = app_type;
+               app_value.state = STC_APP_STATE_BACKGROUND;
                app_value.processes = NULL;
 
-               proc_key.pid = pid;
-
+               proc_value.pid = pid;
                proc_value.ground = STC_APP_STATE_BACKGROUND;
 
-               stc_monitor_application_add(app_key, app_value);
-               stc_monitor_process_add(app_key, proc_key, proc_value);
-               stc_monitor_process_update_ground(app_key, proc_key,
-                                                 STC_APP_STATE_BACKGROUND);
+               fg_classid = get_classid_by_app_id(app_id, FALSE);
+               bg_classid = get_classid_by_app_id(bg_app_id, TRUE);
+
+               stc_plugin_monitor_add_app(bg_classid, bg_app_id, pkg_id, app_value);
+
+               stc_plugin_monitor_move_proc(fg_classid, bg_classid);
 
-               FREE(app_key.pkg_id);
-               FREE(app_key.app_id);
+               stc_plugin_monitor_add_proc(bg_classid, bg_app_id, proc_value);
+               stc_plugin_monitor_update_proc_ground(bg_classid, bg_app_id, proc_value);
+
+               FREE(bg_app_id);
                break;
        }
        case STC_CMD_SET_SERVICE_LAUNCHED:
        {
-               stc_app_key_s app_key;
+               uint32_t classid;
+               char *bg_app_id;
                stc_app_value_s app_value;
-               stc_process_key_s proc_key;
-               stc_process_value_s proc_value;
+               stc_proc_value_s proc_value;
+               gboolean is_exist;
 
-               memset(&app_key, 0, sizeof(stc_app_key_s));
                memset(&app_value, 0, sizeof(stc_app_value_s));
-               memset(&proc_key, 0, sizeof(stc_process_key_s));
-               memset(&proc_value, 0, sizeof(stc_process_value_s));
+               memset(&proc_value, 0, sizeof(stc_proc_value_s));
 
-               app_key.pkg_id = g_strdup(pkg_id);
-               app_key.app_id = g_strconcat(app_id, STC_BACKGROUND_APP_SUFFIX,
-                                            NULL);
+               classid = get_classid_by_app_id(app_id, FALSE);
+               is_exist = stc_plugin_monitor_lookup_app(classid);
+               if (is_exist) {
+                       app_value.type = app_type;
+                       app_value.state = STC_APP_STATE_FOREGROUND;
+                       app_value.processes = NULL;
 
-               app_value.type = app_type;
-               app_value.processes = NULL;
+                       proc_value.pid = pid;
+                       proc_value.ground = STC_APP_STATE_FOREGROUND;
 
-               proc_key.pid = pid;
+                       stc_plugin_monitor_add_app(classid, app_id, pkg_id, app_value);
+                       stc_plugin_monitor_add_proc(classid, app_id, proc_value);
+               } else {
+                       bg_app_id = g_strconcat(app_id, STC_BACKGROUND_APP_SUFFIX, NULL);
+                       classid = get_classid_by_app_id(bg_app_id, TRUE);
 
-               /* services will run always in background. */
-               proc_value.ground = STC_APP_STATE_BACKGROUND;
+                       app_value.type = app_type;
+                       app_value.state = STC_APP_STATE_BACKGROUND;
+                       app_value.processes = NULL;
+
+                       proc_value.pid = pid;
+                       proc_value.ground = STC_APP_STATE_BACKGROUND;
 
-               stc_monitor_application_add(app_key, app_value);
-               stc_monitor_process_add(app_key, proc_key, proc_value);
+                       stc_plugin_monitor_add_app(classid, bg_app_id, pkg_id, app_value);
+                       stc_plugin_monitor_add_proc(classid, bg_app_id, proc_value);
 
-               FREE(app_key.pkg_id);
-               g_free(app_key.app_id);
+                       FREE(bg_app_id);
+               }
                break;
        }
        case STC_CMD_SET_TERMINATED:
        {
-               stc_monitor_process_remove(pid);
+               uint32_t classid;
+               char *bg_app_id;
+
+               bg_app_id = g_strconcat(app_id, STC_BACKGROUND_APP_SUFFIX, NULL);
+               classid = get_classid_by_app_id(bg_app_id, FALSE);
+
+               if (classid == STC_UNKNOWN_CLASSID)
+                       classid = get_classid_by_app_id(app_id, FALSE);
+
+               stc_plugin_monitor_remove_proc(classid, pid);
+
+               FREE(bg_app_id);
                break;
        }
        default:
@@ -669,6 +736,8 @@ API stc_plugin_procfs_s stc_plugin_procfs = {
                stc_plugin_procfs_initialize,
        .deinitialize_plugin =
                stc_plugin_procfs_deinitialize,
+       .procfs_load =
+               stc_plugin_procfs_load,
        .procfs_status_changed =
                stc_plugin_procfs_status_changed
 };