From: Kichan Kwon Date: Tue, 1 Nov 2016 04:47:37 +0000 (+0900) Subject: common : improve module structure X-Git-Tag: accepted/tizen/3.0/ivi/20161205.235125~21 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2100eae3f273cb83341ce0a8dfca806017f02eeb;p=platform%2Fcore%2Fsystem%2Fresourced.git common : improve module structure - Check whether sub-module is successfully loaded or not - Re-establish module priority : LATE(default), NORMAL, EARLY, HIGH Change-Id: Ife26e883af2578f449f65fa253b5026ea5e4ba81 Signed-off-by: Kichan Kwon --- diff --git a/src/common/module.c b/src/common/module.c index b43c32f..c909052 100644 --- a/src/common/module.c +++ b/src/common/module.c @@ -35,7 +35,8 @@ static GSList *modules_list; void add_module(const struct module_ops *module) { ret_msg_if(!module, "Invalid module handler\n"); - if (module->priority == MODULE_PRIORITY_HIGH) + + if (module->priority == MODULE_PRIORITY_EARLY) modules_list = g_slist_prepend(modules_list, (gpointer)module); else modules_list = g_slist_append(modules_list, (gpointer)module); @@ -53,7 +54,8 @@ const struct module_ops *find_module(const char *name) gslist_for_each_item(iter, modules_list) { module = (struct module_ops *)iter->data; - if (!strncmp(module->name, name, strlen(module->name)+1)) + if (!strncmp(module->name, name, strlen(module->name) + 1) && + (module->initalized == MODULE_INITIALIZED)) return module; } return NULL; @@ -63,7 +65,7 @@ void modules_check_runtime_support(void UNUSED *data) { GSList *iter, *next; const struct module_ops *module; - int ret_code = RESOURCED_ERROR_NONE; + int ret; gslist_for_each_safe(modules_list, iter, next, module) { module = (const struct module_ops *)iter->data; @@ -72,8 +74,8 @@ void modules_check_runtime_support(void UNUSED *data) if (!module->check_runtime_support) continue; - ret_code = module->check_runtime_support((void *)module); - if (ret_code != RESOURCED_ERROR_NONE) { + ret = module->check_runtime_support((void *)module); + if (ret != RESOURCED_ERROR_NONE) { _E("%s module check failed", module->name); remove_module(module); continue; @@ -85,55 +87,69 @@ static void module_initcall_level(void *data, int priority) { GSList *iter; struct module_ops *module; - int ret_code = RESOURCED_ERROR_NONE; + int ret; gslist_for_each_item(iter, modules_list) { module = (struct module_ops *)iter->data; - if (priority != MODULE_PRIORITY_ALL && - module->priority != priority) + + assert(module); + + if (module->priority < priority) + continue; + + if (module->initalized != MODULE_NONINITIALIZED) + continue; + + if (!module->init) + continue; + + ret = module->init(data); + /* Module disabled on runtime or just failed to start. */ + if (ret < 0) { + module->initalized = MODULE_DROPPED; + _E("Fail to initialize [%s] module, dropped.", module->name); continue; - if (module->init && !module->initalized) { - _D("Initialized [%s] module\n", module->name); - ret_code = module->init(data); - module->initalized = MODULE_INITIALIZED; } - if (ret_code < 0) - _E("Fail to initialize [%s] module\n", module->name); + + module->initalized = MODULE_INITIALIZED; + _D("Initialized [%s] module\n", module->name); } } -void modules_init(void *data) +void modules_init_right_away(void *data) { - module_initcall_level(data, MODULE_PRIORITY_ALL); + module_initcall_level(data, MODULE_PRIORITY_HIGH); } -void modules_early_init(void *data) +void modules_init_early(void *data) { module_initcall_level(data, MODULE_PRIORITY_EARLY); } -void modules_late_init(void *data) +void modules_init(void *data) { - module_initcall_level(data, MODULE_PRIORITY_HIGH); module_initcall_level(data, MODULE_PRIORITY_NORMAL); + module_initcall_level(data, MODULE_PRIORITY_LATE); } void modules_exit(void *data) { GSList *iter; struct module_ops *module; - int ret_code = RESOURCED_ERROR_NONE; + int ret; gslist_for_each_item(iter, modules_list) { module = (struct module_ops *)iter->data; - _D("Deinitialize [%s] module\n", module->name); - if (module->exit) { - ret_code = module->exit(data); + if (module->exit && (module->initalized == MODULE_INITIALIZED)) { module->initalized = MODULE_NONINITIALIZED; + ret = module->exit(data); + if (ret < 0) + _E("Fail to deinitialize [%s] module\n", module->name); + else + _D("Deinitialize [%s] module\n", module->name); } - if (ret_code < 0) - _E("Fail to deinitialize [%s] module\n", module->name); } + g_slist_free(modules_list); } void modules_dump(FILE *fp, int mode) @@ -143,6 +159,9 @@ void modules_dump(FILE *fp, int mode) gslist_for_each_item(iter, modules_list) { module = (struct module_ops *)iter->data; + if (module->initalized != MODULE_INITIALIZED) + continue; + _D("dump [%s] module\n", module->name); if (module->dump) module->dump(fp, mode, module->dump_data); @@ -168,6 +187,8 @@ static DBusMessage *edbus_list_active_modules_handler(E_DBus_Object *obj, DBusMe gslist_for_each_item(list_iter, modules_list) { module = (struct module_ops *)list_iter->data; + if (module->initalized != MODULE_INITIALIZED) + continue; if (!dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, diff --git a/src/common/module.h b/src/common/module.h index 5c636ee..2cee7dd 100644 --- a/src/common/module.h +++ b/src/common/module.h @@ -25,19 +25,53 @@ #ifndef __MODULE_HANDLE_H__ #define __MODULE_HANDLE_H__ +/** + * @brief module_priority is used to initialization order of each + * modules. + */ enum module_priority { + /** + * MODULE_PRIORITY_LATE is default priority of modules. + * These modules are initialized after other modules + * are initialized. + */ + MODULE_PRIORITY_LATE = 0, + + /** + * MODULE_PRIORITY_NORMAL modules are initialized after + * booting is done. + */ MODULE_PRIORITY_NORMAL, - MODULE_PRIORITY_HIGH, + + /** + * MODULE_PRIORITY_EARLY modules are initialized + * before MODULE_PRIORITY_NORMAL modules. + */ MODULE_PRIORITY_EARLY, - MODULE_PRIORITY_ALL, + + /** + * MODULE_PRIORITY_HIGH modules are initialized + * as soon as resourced is started. + */ + MODULE_PRIORITY_HIGH, }; enum module_state { MODULE_NONINITIALIZED, MODULE_INITIALIZED, + MODULE_DROPPED, }; - +/* + * Each module must have at least those field defined: + * .priority (default : MODULE_PRIORITY_LATE) + * .name (name of the module, as string) + * .init (must return RESOURCED_ERROR_NONE on success) + * .exit (must return RESOURCED_ERROR_NONE on success) + * + * All rest of callbacks are optional for module to work. + * + */ struct module_ops { enum module_priority priority; enum module_state initalized; @@ -55,10 +89,11 @@ void add_module(const struct module_ops *module); void remove_module(const struct module_ops *module); void modules_check_runtime_support(void *data); +void modules_init_right_away(void *data); +void modules_init_early(void *data); void modules_init(void *data); -void modules_early_init(void *data); -void modules_late_init(void *data); void modules_exit(void *data); +void modules_restore(void *data); void modules_dump(FILE *fp, int mode); int modules_add_methods(void); diff --git a/src/heart/heart.c b/src/heart/heart.c index 8c11909..9507f1c 100644 --- a/src/heart/heart.c +++ b/src/heart/heart.c @@ -72,11 +72,11 @@ static void heart_module_init(void *data) gslist_for_each_item(iter, heart_module) { module = (struct heart_module_ops *)iter->data; - _D("Initialize [%s] module\n", module->name); + _D("Initialize [HEART-%s] module\n", module->name); if (module->init) ret = module->init(data); if (ret != RESOURCED_ERROR_NONE) - _E("Fail to initialize [%s] module\n", module->name); + _E("Fail to initialize [HEART-%s] module\n", module->name); } } @@ -88,11 +88,11 @@ static void heart_module_exit(void *data) gslist_for_each_item(iter, heart_module) { module = (struct heart_module_ops *)iter->data; - _D("Deinitialize [%s] module\n", module->name); + _D("Deinitialize [HEART-%s] module\n", module->name); if (module->exit) ret = module->exit(data); if (ret != RESOURCED_ERROR_NONE) - _E("Fail to deinitialize [%s] module\n", module->name); + _E("Fail to deinitialize [HEART-%s] module\n", module->name); } } @@ -209,7 +209,7 @@ static int resourced_heart_exit(void *data) } static struct module_ops heart_modules_ops = { - .priority = MODULE_PRIORITY_HIGH, + .priority = MODULE_PRIORITY_LATE, .name = "HEART", .init = resourced_heart_init, .dump = resourced_heart_dump, diff --git a/src/memory/vmpressure-lowmem-handler.c b/src/memory/vmpressure-lowmem-handler.c index f0912c5..373c843 100644 --- a/src/memory/vmpressure-lowmem-handler.c +++ b/src/memory/vmpressure-lowmem-handler.c @@ -2244,7 +2244,7 @@ int lowmem_get_memcg(enum memcg_type type, struct memcg **memcg_ptr) } static struct module_ops memory_modules_ops = { - .priority = MODULE_PRIORITY_EARLY, + .priority = MODULE_PRIORITY_HIGH, .name = "lowmem", .init = resourced_memory_init, .exit = resourced_memory_finalize, diff --git a/src/proc-stat/proc-main.c b/src/proc-stat/proc-main.c index a3d7040..24cd325 100644 --- a/src/proc-stat/proc-main.c +++ b/src/proc-stat/proc-main.c @@ -1119,7 +1119,7 @@ void resourced_proc_dump(int mode, const char *dirpath) } static struct module_ops proc_modules_ops = { - .priority = MODULE_PRIORITY_EARLY, + .priority = MODULE_PRIORITY_HIGH, .name = "PROC", .init = resourced_proc_init, .exit = resourced_proc_exit, diff --git a/src/proc-stat/proc-monitor.c b/src/proc-stat/proc-monitor.c index ebd41b3..ebca9ea 100644 --- a/src/proc-stat/proc-monitor.c +++ b/src/proc-stat/proc-monitor.c @@ -953,7 +953,7 @@ static void early_booting_done_signal_handler(void *data, DBusMessage *msg) } _I("launching remaining modules (booting done)"); - modules_late_init(NULL); + modules_init_early(NULL); } static void low_battery_signal_handler(void *data, DBusMessage *msg) diff --git a/src/resourced/main.c b/src/resourced/main.c index 0056b9a..e2cca7d 100644 --- a/src/resourced/main.c +++ b/src/resourced/main.c @@ -55,7 +55,7 @@ int main(int argc, char **argv) resourced_notify(RESOURCED_NOTIFIER_BOOTING_DONE, NULL); } else { _I("launch high priority modules"); - modules_early_init(NULL); + modules_init_right_away(NULL); } sd_notify(0, "READY=1"); diff --git a/src/timer-slack/timer-slack.c b/src/timer-slack/timer-slack.c index ccfe2d5..969462c 100644 --- a/src/timer-slack/timer-slack.c +++ b/src/timer-slack/timer-slack.c @@ -268,7 +268,7 @@ static int resourced_timer_slack_finalize(void *data) static const struct module_ops timer_modules_ops = { .priority = MODULE_PRIORITY_NORMAL, - .name = TIMER_MODULE_NAME, + .name = "timer", .init = resourced_timer_slack_init, .exit = resourced_timer_slack_finalize, .check_runtime_support = resourced_timer_slack_check_runtime_support, diff --git a/src/timer-slack/timer-slack.h b/src/timer-slack/timer-slack.h index e6a3368..44219eb 100644 --- a/src/timer-slack/timer-slack.h +++ b/src/timer-slack/timer-slack.h @@ -27,7 +27,6 @@ #include #define TIMER_CGROUP_PATH "/sys/fs/cgroup/timer_slack" -#define TIMER_MODULE_NAME "timer" enum timer_cgroup_type { TIMER_CGROUP_DEFAULT,