summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHwankyu Jhun <h.jhun@samsung.com>2020-05-18 20:50:19 +0900
committerHwanKyu Jhun <h.jhun@samsung.com>2020-05-19 00:10:38 +0000
commit3e9b00eb14490eb8ef40dd3942cf36555edca09c (patch)
treee23af7dea7b033c603943685f1d0c5b97a48eb91
parentce958985b913488dc10b14fd9f9ce9be1e12c596 (diff)
downloadlaunchpad-3e9b00eb14490eb8ef40dd3942cf36555edca09c.tar.gz
launchpad-3e9b00eb14490eb8ef40dd3942cf36555edca09c.tar.bz2
launchpad-3e9b00eb14490eb8ef40dd3942cf36555edca09c.zip
Fix loader management
If the cpu check count has exceeded 10 times, the loader context is queuing and the next loader context will be checked. The platform developer can adjust the maximum CPU check count by modifying launchpad.conf file. Change-Id: I0e0917cff2b88cbf6d1a6ea2b0e2fedb983d9ebf Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
-rw-r--r--src/launchpad/conf/launchpad.conf.in3
-rw-r--r--src/launchpad/inc/launchpad_config.h1
-rw-r--r--src/launchpad/src/launchpad.c30
-rw-r--r--src/launchpad/src/launchpad_config.c36
4 files changed, 66 insertions, 4 deletions
diff --git a/src/launchpad/conf/launchpad.conf.in b/src/launchpad/conf/launchpad.conf.in
index 3615188..6e7e6b2 100644
--- a/src/launchpad/conf/launchpad.conf.in
+++ b/src/launchpad/conf/launchpad.conf.in
@@ -7,3 +7,6 @@ NormalValue=1
[MemoryMonitor]
Threshold=80
Interval=5000
+
+[CpuChecker]
+MaxCount=10
diff --git a/src/launchpad/inc/launchpad_config.h b/src/launchpad/inc/launchpad_config.h
index 1d2ee1e..328f839 100644
--- a/src/launchpad/inc/launchpad_config.h
+++ b/src/launchpad/inc/launchpad_config.h
@@ -24,6 +24,7 @@ typedef enum {
CONFIG_TYPE_MEMORY_STATUS_NORMAL_VALUE,
CONFIG_TYPE_MEMORY_MONITOR_THRESHOLD,
CONFIG_TYPE_MEMORY_MONITOR_INTERVAL,
+ CONFIG_TYPE_CPU_CHECKER_MAX_COUNT,
} config_type_e;
const char *_config_get_string_value(config_type_e type);
diff --git a/src/launchpad/src/launchpad.c b/src/launchpad/src/launchpad.c
index da7042b..de35efb 100644
--- a/src/launchpad/src/launchpad.c
+++ b/src/launchpad/src/launchpad.c
@@ -122,6 +122,7 @@ typedef struct {
io_channel_h hydra_channel;
unsigned int score;
unsigned int pss;
+ int cpu_check_count;
} candidate_process_context_t;
typedef struct {
@@ -167,6 +168,7 @@ static int __memory_status_normal;
static sequencer __sequencer;
static int MEMORY_STATUS_LOW;
static int MEMORY_STATUS_NORMAL;
+static int MAX_CPU_CHECK_COUNT;
static io_channel_h __logger_channel;
static io_channel_h __label_monitor_channel;
@@ -231,6 +233,7 @@ static gboolean __handle_queuing_slots(gpointer data)
_get_cpu_idle(&total, &idle);
cpc->cpu_idle_time = idle;
cpc->cpu_total_time = total;
+ cpc->cpu_check_count = 0;
__sequencer.idle_checker = g_timeout_add(CPU_CHECKER_TIMEOUT,
__handle_idle_checker, cpc);
@@ -1603,14 +1606,16 @@ static gboolean __handle_idle_checker(gpointer data)
cpc = (candidate_process_context_t *)data;
if (cpc->app_check && !cpc->app_exists) {
- _W("The application is not installed. Type(%d)", cpc->type);
+ _W("The application is not installed. loader(%s:%d)",
+ cpc->loader_name, cpc->type);
__sequencer.idle_checker = 0;
__sequencer.running_cpc = NULL;
return G_SOURCE_REMOVE;
}
if (cpc->state != CANDIDATE_PROCESS_STATE_RUNNING) {
- _W("Slot state is not running. Type(%d)", cpc->type);
+ _W("Slot state is not running. loader(%s:%d)",
+ cpc->loader_name, cpc->type);
__sequencer.idle_checker = 0;
__sequencer.running_cpc = NULL;
return G_SOURCE_REMOVE;
@@ -1621,7 +1626,7 @@ static gboolean __handle_idle_checker(gpointer data)
total++;
per = (idle - cpc->cpu_idle_time) * 100 / (total - cpc->cpu_total_time);
- _D("[CPU] Idle : %d / type : %d", per, cpc->type);
+ _D("[CPU] Idle : %d / loader(%s:%d)", per, cpc->loader_name, cpc->type);
if (per >= cpc->threshold) {
__update_threshold(cpc, -0.02f * (per - cpc->threshold));
@@ -1636,6 +1641,18 @@ static gboolean __handle_idle_checker(gpointer data)
cpc->cpu_total_time = total;
__update_threshold(cpc, 0.05f);
+ cpc->cpu_check_count++;
+ if (cpc->cpu_check_count == MAX_CPU_CHECK_COUNT) {
+ _W("CPU check count has exceeded %d times. loader(%s:%d)",
+ cpc->cpu_check_count,
+ cpc->loader_name,
+ cpc->type);
+ __sequencer.idle_checker = 0;
+ __sequencer.running_cpc = NULL;
+ __sequencer_add_slot(cpc);
+ return G_SOURCE_REMOVE;
+ }
+
return G_SOURCE_CONTINUE;
}
@@ -2298,6 +2315,7 @@ static candidate_process_context_t *__create_slot(int type, int loader_id,
cpc->app_check = app_check;
cpc->score = WIN_SCORE;
cpc->pss = 0;
+ cpc->cpu_check_count = 0;
if ((cpc->deactivation_method & METHOD_OUT_OF_MEMORY) &&
__is_low_memory())
@@ -2305,6 +2323,8 @@ static candidate_process_context_t *__create_slot(int type, int loader_id,
else
cpc->state = CANDIDATE_PROCESS_STATE_RUNNING;
+ _W("loader(%s), type(%d), state(%d)",
+ cpc->loader_name, cpc->type, cpc->state);
return cpc;
}
@@ -2873,12 +2893,12 @@ static int __memory_monitor_cb(bool low_memory, void *user_data)
{
candidate_process_context_t *cpc;
- _W("low memory(%s)", low_memory ? "true" : "false");
cpc = __get_running_slot(false);
if (!cpc && low_memory)
return -1;
if (low_memory) {
+ _W("Low memory");
__update_slots_pss();
candidate_slot_list = g_list_sort(candidate_slot_list,
@@ -2936,6 +2956,8 @@ static int __before_loop(int argc, char **argv)
_inotify_init();
+ MAX_CPU_CHECK_COUNT = _config_get_int_value(
+ CONFIG_TYPE_CPU_CHECKER_MAX_COUNT);
__add_default_slots();
launcher_info_list = _launcher_info_load(LAUNCHER_INFO_PATH);
diff --git a/src/launchpad/src/launchpad_config.c b/src/launchpad/src/launchpad_config.c
index 5b517b0..0838dd7 100644
--- a/src/launchpad/src/launchpad_config.c
+++ b/src/launchpad/src/launchpad_config.c
@@ -40,6 +40,9 @@
#define KEY_MEMORY_MONITOR_THRESHOLD "Threshold"
#define KEY_MEMORY_MONITOR_INTERVAL "Interval"
+#define TAG_CPU_CHECKER "CpuChecker"
+#define KEY_CPU_CHECKER_MAX_COUNT "MaxCount"
+
struct memory_status_s {
char *low_key;
int low_value;
@@ -52,8 +55,13 @@ struct memory_monitor_s {
int interval;
};
+struct cpu_checker_s {
+ int max_count;
+};
+
static struct memory_status_s __memory_status;
static struct memory_monitor_s __memory_monitor;
+static struct cpu_checker_s __cpu_checker;
const char *_config_get_string_value(config_type_e type)
{
@@ -92,6 +100,9 @@ int _config_get_int_value(config_type_e type)
case CONFIG_TYPE_MEMORY_MONITOR_INTERVAL:
value = __memory_monitor.interval;
break;
+ case CONFIG_TYPE_CPU_CHECKER_MAX_COUNT:
+ value = __cpu_checker.max_count;
+ break;
default:
_E("Unknown type");
value = INT_MIN;
@@ -208,6 +219,28 @@ static void __memory_monitor_set(dictionary *d)
__memory_monitor.interval);
}
+static void __cpu_checker_init(void)
+{
+ __cpu_checker.max_count = 10;
+}
+
+static void __cpu_checker_fini(void)
+{
+ __cpu_checker.max_count = 0;
+}
+
+static void __cpu_checker_set(dictionary *d)
+{
+ int ret;
+
+ ret = __get_int_value(d, TAG_CPU_CHECKER,
+ KEY_CPU_CHECKER_MAX_COUNT);
+ if (ret != INT_MAX)
+ __cpu_checker.max_count = ret;
+
+ _W("CPU Checker MaxCount(%d)", __cpu_checker.max_count);
+}
+
int _config_init(void)
{
dictionary *d;
@@ -217,6 +250,7 @@ int _config_init(void)
__memory_status_init();
__memory_monitor_init();
+ __cpu_checker_init();
ret = access(PATH_LAUNCHPAD_CONF, F_OK);
if (ret != 0) {
@@ -232,6 +266,7 @@ int _config_init(void)
__memory_status_set(d);
__memory_monitor_set(d);
+ __cpu_checker_set(d);
iniparser_freedict(d);
@@ -242,6 +277,7 @@ void _config_fini(void)
{
_D("config fini");
+ __cpu_checker_fini();
__memory_monitor_fini();
__memory_status_fini();
}