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);
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;
{
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;
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;
{
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)
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);
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,
#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;
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);
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);
}
}
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);
}
}
}
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,