proc-manager : set the default oom_score_adj for launched app 71/186071/2
authorKichan Kwon <k_c.kwon@samsung.com>
Tue, 7 Aug 2018 05:24:54 +0000 (14:24 +0900)
committerKichan Kwon <k_c.kwon@samsung.com>
Tue, 7 Aug 2018 06:34:06 +0000 (15:34 +0900)
- Having VIP attribute : OOM_SCORE_ADJ_VIP
- Default : OOM_SCORE_ADJ_DEFAULT

Change-Id: Ic7b55531c02a6c92646a09f79f1cb18d8a9e881a
Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
src/common/macro.h
src/common/procfs.h
src/proc-manager/proc-manager-common.h
src/proc-manager/proc-manager-dbus.c

index 337fce959b7d890189adb0f4cf3f5c7d6a179c7c..a409298f676390809123db44a530e7cf01b762b9 100644 (file)
                node##_next = g_slist_next(node##_cur))
 
 /**
- * @brief  Other macros
+ * @brief  Size conversion macro
  */
 
-#define ARRAY_SIZE(arr)        (sizeof(arr) / sizeof(arr[0]))
-
 #define BYTE_TO_KBYTE(b) ((b) >> 10)
 
 #define KBYTE_TO_MBYTE(k) ((k) >> 10)
 
 #define PAGE_TO_KBYTE(p) ((p) << 2)
 
+/**
+ * @brief  Other macros
+ */
+
+#define ARRAY_SIZE(arr)        (sizeof(arr) / sizeof(arr[0]))
+
+#define CHECK_BIT(bit_arr, bit) ((bit_arr) & (bit))
+
 #endif /* __RESOURCED_HEADLESS_MACRO_H__ */
index 05fa488f500f9e4571498f59912e791f5c9948d7..79db30c9c80c8c47c452c44ac3c7bfbab638021e 100644 (file)
 /**
  * @brief  oom_score_adj related macro
  */
-#define OOM_SCORE_ADJ_MIN (-1000)
-#define OOM_SCORE_ADJ_MAX (1000)
+#define OOM_SCORE_ADJ_MIN     (-1000)
+#define OOM_SCORE_ADJ_VIP     (0) /* For app having VIP attribute */
+#define OOM_SCORE_ADJ_DEFAULT (100)
+#define OOM_SCORE_ADJ_MAX     (1000)
 
 /* To fit the multiple of 8 together with "char state" */
 #define COMM_SIZE      31
index 382dfc430494280dc1d58736032ebab72d080465..88f095c60306f007d02b3dff2fe8a37d44dd86c8 100644 (file)
 #define PROC_MANAGER_GROUP                "proc-manager"
 #define PROC_MANAGER_OSA_PREDEFINED_APP_GROUP  PROC_MANAGER_GROUP".oom_score_predefined_app"
 
+/**
+ * @brief  The flag received with app prelaunch signal
+ */
+enum proc_manager_prelaunch_flag {
+       PROC_MANAGER_PRELAUNCH_FLAG_NONE          = 0x00u,
+       PROC_MANAGER_PRELAUNCH_FLAG_VIP_ATTRIBUTE = 0x20u,
+};
+
 /**
  * @details  Key(appid), Value(predefined oom_score_adj)
  */
index 932468454cc8f5776e73e34040bfa5b21e024b2e..e3ac81021e792e7ccc8c8adc431fc6a714a05ddc 100644 (file)
 #include "proc-manager-common.h"
 #include "proc-manager-dbus.h"
 
+/**
+ * @brief  Temporary prelaunch flag storage
+ * @details  Key(appid), Value(prelaunch flag)
+ *           Each key is removed after app is launched
+ */
+static GHashTable *proc_manager_dbus_prelaunch_flag_storage = NULL;
+
 /**
  * @brief  D-Bus signal handler for AppLaunch
  */
 static void proc_manager_dbus_app_launch(GVariant *params)
 {
        int ret;
-       int *predefined_osa = NULL;
+       int initial_osa = OOM_SCORE_ADJ_DEFAULT;
        pid_t pid = 0;
        char *appid = NULL;
        char *pkgid = NULL;
        char *pkgtype = NULL;
+       int *prelaunch_flag = NULL;
+       int *predefined_osa = NULL;
 
        g_variant_get(params, "(i&s&s&s)", &pid, &appid, &pkgid, &pkgtype);
        if (pid == 0 || !appid || !pkgid || !pkgtype) {
@@ -49,13 +58,27 @@ static void proc_manager_dbus_app_launch(GVariant *params)
        _D("App launched : pid(%u), appid(%s), pkgid(%s), pkgtype(%s)",
                        pid, appid, pkgid, pkgtype);
 
+       /* Check prelaunch flag */
+       prelaunch_flag = (int *)g_hash_table_lookup(proc_manager_dbus_prelaunch_flag_storage, (gpointer)appid);
+       if (prelaunch_flag) {
+               if (CHECK_BIT(*prelaunch_flag, PROC_MANAGER_PRELAUNCH_FLAG_VIP_ATTRIBUTE)) {
+                       initial_osa = OOM_SCORE_ADJ_VIP;
+               }
+
+               /* Remove prelaunch flag after using it */
+               g_hash_table_remove(proc_manager_dbus_prelaunch_flag_storage, (gpointer)appid);
+       }
+
+       /* Check oom_score_predefined_app list*/
        predefined_osa = (int *)g_hash_table_lookup(proc_manager_osa_predefined_app_list, (gpointer)appid);
        if (predefined_osa) {
-               _D("%s is oom_score_adj predefined app. Set to %d", appid, *predefined_osa);
-               ret = procfs_set_oom_score_adj(pid, *predefined_osa);
-               if (ret < 0)
-                       _E("Failed to set oom_score_adj for PID %u (%d)", pid, ret);
+               initial_osa = *predefined_osa;
+               _D("%s is oom_score_adj predefined app. Set to %d", appid, initial_osa);
        }
+
+       ret = procfs_set_oom_score_adj(pid, initial_osa);
+       if (ret < 0)
+               _E("Failed to set oom_score_adj for PID %u (%d)", pid, ret);
 }
 
 /**
@@ -65,6 +88,8 @@ static void proc_manager_dbus_app_prelaunch(GVariant *params)
 {
        char *appid = NULL;
        char *pkgid = NULL;
+       gchar *key;
+       gint *value;
        int flags = -1;
        int categories = -1;
 
@@ -76,6 +101,13 @@ static void proc_manager_dbus_app_prelaunch(GVariant *params)
 
        _D("App prelaunched : appid(%s), pkgid(%s), flags(0x%x), categories(0x%x)",
                        appid, pkgid, flags, categories);
+
+       key = g_strndup(appid, strlen(appid));
+       value = g_malloc(sizeof(gint));
+       g_assert(key && value);
+
+       *value = flags;
+       g_hash_table_insert(proc_manager_dbus_prelaunch_flag_storage, key, value);
 }
 
 static struct dbus_signal proc_manager_dbus_signals_amd[] = {
@@ -104,5 +136,8 @@ int proc_manager_dbus_init(void)
                return ret;
        }
 
+       proc_manager_dbus_prelaunch_flag_storage = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+       g_assert(proc_manager_dbus_prelaunch_flag_storage);
+
        return 0;
 }