common : improve module structure 45/94745/9
authorKichan Kwon <k_c.kwon@samsung.com>
Tue, 1 Nov 2016 04:47:37 +0000 (13:47 +0900)
committerKichan Kwon <k_c.kwon@samsung.com>
Mon, 7 Nov 2016 04:53:49 +0000 (13:53 +0900)
- 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 <k_c.kwon@samsung.com>
src/common/module.c
src/common/module.h
src/heart/heart.c
src/memory/vmpressure-lowmem-handler.c
src/proc-stat/proc-main.c
src/proc-stat/proc-monitor.c
src/resourced/main.c
src/timer-slack/timer-slack.c
src/timer-slack/timer-slack.h

index b43c32f..c909052 100644 (file)
@@ -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,
index 5c636ee..2cee7dd 100644 (file)
 #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);
 
index 8c11909..9507f1c 100644 (file)
@@ -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,
index f0912c5..373c843 100644 (file)
@@ -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,
index a3d7040..24cd325 100644 (file)
@@ -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,
index ebd41b3..ebca9ea 100644 (file)
@@ -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)
index 0056b9a..e2cca7d 100644 (file)
@@ -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");
 
index ccfe2d5..969462c 100644 (file)
@@ -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,
index e6a3368..44219eb 100644 (file)
@@ -27,7 +27,6 @@
 
 #include <sys/types.h>
 #define TIMER_CGROUP_PATH              "/sys/fs/cgroup/timer_slack"
-#define TIMER_MODULE_NAME              "timer"
 
 enum timer_cgroup_type {
        TIMER_CGROUP_DEFAULT,