aboutsummaryrefslogtreecommitdiffstats
path: root/src/framework/init/fw_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/framework/init/fw_init.c')
-rw-r--r--src/framework/init/fw_init.c355
1 files changed, 184 insertions, 171 deletions
diff --git a/src/framework/init/fw_init.c b/src/framework/init/fw_init.c
index 2764479..636fe20 100644
--- a/src/framework/init/fw_init.c
+++ b/src/framework/init/fw_init.c
@@ -18,6 +18,7 @@
#include <stdlib.h>
#include <string.h>
#include "nstack_securec.h"
+#include "nsfw_init_api.h"
#include "fw_module.h"
#include "nstack_log.h"
@@ -27,290 +28,302 @@ extern "C"{
/* *INDENT-ON* */
#endif /* __cplusplus */
-NSTACK_STATIC int
-nsfw_module_instance_isIndepend (nsfw_module_instance_t * inst)
+int g_fw_init_err = 0;
+int get_fw_init_err()
{
- nsfw_module_depends_t *dep = inst->depends;
- while (dep)
+ return g_fw_init_err;
+}
+
+void set_fw_init_err(int x)
+{
+ g_fw_init_err = x;
+}
+
+NSTACK_STATIC int nsfw_module_instance_is_independ(nsfw_module_instance_t *
+ inst)
+{
+ nsfw_module_depends_t *dep = inst->depends;
+ while (dep)
{
- if (!dep->isReady)
- return 1;
- dep = dep->next;
+ if (!dep->isReady)
+ return 1;
+ dep = dep->next;
}
- return 0;
+ return 0;
}
-NSTACK_STATIC void
-nsfw_module_instance_depend_check (nsfw_module_instance_t * inst)
+NSTACK_STATIC void nsfw_module_instance_depend_check(nsfw_module_instance_t *
+ inst)
{
- nsfw_module_instance_t *curInst = nsfw_module_getManager ()->inst;
- while (curInst)
+ nsfw_module_instance_t *curInst = nsfw_module_get_manager()->inst;
+ while (curInst)
{
- if (curInst == inst)
- goto nextLoop;
- if (NSFW_INST_STAT_CHECKING == curInst->stat
- || NSFW_INST_STAT_DEPENDING == curInst->stat)
+ if (curInst == inst)
+ goto nextLoop;
+ if (NSFW_INST_STAT_CHECKING == curInst->stat
+ || NSFW_INST_STAT_DEPENDING == curInst->stat)
{
- nsfw_module_depends_t *dep = curInst->depends;
- while (dep)
+ nsfw_module_depends_t *dep = curInst->depends;
+ while (dep)
{
- if (0 == dep->isReady && 0 == strcmp (dep->name, inst->name))
+ if (0 == dep->isReady && 0 == strcmp(dep->name, inst->name))
{
- dep->isReady = 1; /* Don't break for case that duplicate name exist, though I think it should
+ dep->isReady = 1; /* Don't break for case that duplicate name exist, though I think it should
not happen */
}
- dep = dep->next;
+ dep = dep->next;
}
}
- nextLoop:
- curInst = curInst->next;
+ nextLoop: /*this type usually use like this and no "space" */
+ curInst = curInst->next;
}
}
-/**
- * @Function nstack_framework_init
- * @Description Init child modules
- * @param father instance , NULL means root
- * @return 0 on success, -1 on error
- */
-NSTACK_STATIC int
-nstack_framework_initChild_unsafe (nsfw_module_instance_t * father)
+NSTACK_STATIC int nstack_framework_init_child_unsafe(nsfw_module_instance_t *
+ father)
{
- NSFW_LOGDBG ("init framework module] name=%s",
- father ? father->name : "NULL");
-
- nsfw_module_instance_t *inst = nsfw_module_getManager ()->inst;
+ NSFW_LOGDBG("init framework module] name=%s",
+ father ? father->name : "NULL");
- while (inst)
+ nsfw_module_instance_t *inst = nsfw_module_get_manager()->inst;
+ int initRet = 0;
+ while (inst)
{
- NSFW_LOGDBG
- ("init child] inst=%s, inst->father=%s, inst->depends=%s, inst->state=%d",
- inst->name, inst->father ? inst->father->name : "NULL",
- inst->depends ? inst->depends->name : "NULL", inst->stat);
+ NSFW_LOGDBG
+ ("init child] inst=%s, inst->father=%s, inst->depends=%s, inst->state=%d",
+ inst->name, inst->father ? inst->father->name : "NULL",
+ inst->depends ? inst->depends->name : "NULL", inst->stat);
- if (father != inst->father)
+ if (father != inst->father)
{
- NSFW_LOGDBG ("inst->father not match] inst=%s, ", inst->name);
+ NSFW_LOGDBG("inst->father not match] inst=%s, ", inst->name);
- inst = inst->next;
- continue;
+ inst = inst->next;
+ continue;
}
- switch (inst->stat)
+ switch (inst->stat)
{
- case NSFW_INST_STAT_CHECKING:
- /* First, check if any depends, then check if other instance depends on it */
- if (nsfw_module_instance_isIndepend (inst))
- {
- inst->stat = NSFW_INST_STAT_DEPENDING;
- NSFW_LOGDBG ("inst is still depending] name=%s", inst->name);
- inst = inst->next;
- break;
- }
+ case NSFW_INST_STAT_CHECKING:
+ /* First, check if any depends, then check if other instance depends on it */
+ if (nsfw_module_instance_is_independ(inst))
+ {
+ inst->stat = NSFW_INST_STAT_DEPENDING;
+ NSFW_LOGDBG("inst is still depending] name=%s",
+ inst->name);
+ inst = inst->next;
+ break;
+ }
- NSFW_LOGINF ("Going to init module] name=%s, init fun=%p",
- inst->name, inst->fnInit);
- if (NULL != inst->fnInit && 0 != inst->fnInit (inst->param))
- {
- NSFW_LOGERR ("initial fail!!!] inst=%s", inst->name);
- inst->stat = NSFW_INST_STAT_FAIL;
- return -1;
- }
+ NSFW_LOGINF("Going to init module]name=%s,init fun=%p",
+ inst->name, inst->fnInit);
+ if (NULL != inst->fnInit
+ && 0 != (initRet = inst->fnInit(inst->param)))
+ {
+ NSFW_LOGERR("initial fail]inst=%s,initRet=%d",
+ inst->name, initRet);
+ inst->stat = NSFW_INST_STAT_FAIL;
+ if (get_fw_init_err() == 0) /* record first init err */
+ {
+ NSFW_LOGERR("update g_fw_init_err to %d", initRet);
+ /* TODO: now g_fw_init_err conveys errcode and be processed in master_main,
+ * better way is to regsiter an error-handler for each inst */
+ set_fw_init_err(initRet);
+ }
+ return -1;
+ }
- inst->stat = NSFW_INST_STAT_DONE;
- nsfw_module_instance_depend_check (inst);
+ inst->stat = NSFW_INST_STAT_DONE;
+ nsfw_module_instance_depend_check(inst);
- if (-1 == nsfw_module_addDoneNode (inst))
- {
- NSFW_LOGERR ("add done node fail");
- }
+ if (-1 == nsfw_module_add_done_node(inst))
+ {
+ NSFW_LOGERR("add done node fail");
+ }
- inst = nsfw_module_getManager ()->inst; /* check from begining */
- break;
- case NSFW_INST_STAT_DEPENDING:
- /* check if depending stat is still there */
- if (!nsfw_module_instance_isIndepend (inst))
- {
- inst->stat = NSFW_INST_STAT_CHECKING;
- break;
- }
- case NSFW_INST_STAT_FAIL:
- case NSFW_INST_STAT_DONE:
- default:
- inst = inst->next;
- break;
+ inst = nsfw_module_get_manager()->inst; /* check from begining */
+ break;
+ case NSFW_INST_STAT_DEPENDING:
+ /* check if depending stat is still there */
+ if (!nsfw_module_instance_is_independ(inst))
+ {
+ inst->stat = NSFW_INST_STAT_CHECKING;
+ break;
+ }
+ case NSFW_INST_STAT_FAIL:
+ case NSFW_INST_STAT_DONE:
+ default:
+ inst = inst->next;
+ break;
}
}
- return 0;
+ return 0;
}
-NSTACK_STATIC void
-nstack_framework_printInstanceInfo (nsfw_module_instance_t * inst)
+NSTACK_STATIC
+ void nstack_framework_print_instance_info(nsfw_module_instance_t * inst)
{
- if (NULL == inst)
+ if (NULL == inst)
{
- NSFW_LOGERR ("param error,inst==NULL");
- return;
+ NSFW_LOGERR("param err]inst=NULL");
+ return;
}
- char info[1024] = "";
- int plen = 0;
+ char info[1000] = "";
+ int plen = 0;
- int ret = SPRINTF_S (info, sizeof (info), "Inst:%s,father:%s,depends:",
- inst->name,
- inst->father ? inst->father->name : "NULL");
+ int ret = sprintf_s(info, sizeof(info), "Inst:%s,father:%s,depends:",
+ inst->name,
+ inst->father ? inst->father->name : "NULL");
- if (ret <= 0)
+ if (ret <= 0)
{
- NSFW_LOGERR ("Sprintf Error] module=%s,state=%d, ret=%d", inst->name,
- inst->stat, ret);
- return;
+ NSFW_LOGERR("Sprintf err]module=%s,state=%d,ret=%d", inst->name,
+ inst->stat, ret);
+ return;
}
- else
+ else
{
- plen += ret;
+ plen += ret;
}
- if (NULL == inst->depends)
+ if (NULL == inst->depends)
{
- ret = SPRINTF_S (info + plen, sizeof (info) - plen, "NULL");
- if (ret <= 0)
+ ret = sprintf_s(info + plen, sizeof(info) - plen, "NULL");
+ if (ret <= 0)
{
- NSFW_LOGERR ("Sprintf Error] module=%s,state=%d, ret=%d",
- inst->name, inst->stat, ret);
- return;
+ NSFW_LOGERR("Sprintf Err]module=%s,state=%d,ret=%d", inst->name,
+ inst->stat, ret);
+ return;
}
- NSFW_LOGINF ("] inst info=%s", info);
- return;
+ NSFW_LOGINF("]inst info=%s", info);
+ return;
}
- nsfw_module_depends_t *dep = inst->depends;
- while (dep)
+ nsfw_module_depends_t *dep = inst->depends;
+ while (dep && (plen < (int) sizeof(info)))
{
- ret = SPRINTF_S (info + plen, sizeof (info) - plen, "%s ", dep->name);
- if (ret <= 0)
+ ret = sprintf_s(info + plen, sizeof(info) - plen, "%s ", dep->name);
+ if (ret <= 0)
{
- NSFW_LOGERR ("Sprintf Error] module=%s,state=%d, ret=%d",
- inst->name, inst->stat, ret);
- return;
+ NSFW_LOGERR("Sprintf Err]module=%s,state=%d,ret=%d", inst->name,
+ inst->stat, ret);
+ return;
}
- plen += ret;
- dep = dep->next;
+ plen += ret;
+ dep = dep->next;
}
- NSFW_LOGINF ("] inst info=%s", info);
+ NSFW_LOGINF("]inst info=%s", info);
}
-NSTACK_STATIC void
-nstack_framework_printInitialResult ()
+NSTACK_STATIC void nstack_framework_print_initial_result()
{
- nsfw_module_manager_t *manager = nsfw_module_getManager ();
+ nsfw_module_manager_t *manager = nsfw_module_get_manager();
- if (manager->doneHead)
+ if (manager->doneHead)
{
- NSFW_LOGINF ("Here is the initial done modules: ");
+ NSFW_LOGINF("Here is the initial done modules: ");
- nsfw_module_doneNode_t *curNode = manager->doneHead;
- while (curNode)
+ nsfw_module_done_node_t *curNode = manager->doneHead;
+ while (curNode)
{
- nstack_framework_printInstanceInfo (curNode->inst);
- curNode = curNode->next;
+ nstack_framework_print_instance_info(curNode->inst);
+ curNode = curNode->next;
}
}
- else
+ else
{
- NSFW_LOGERR ("No initial done modules");
+ NSFW_LOGERR("No initial done modules");
}
- nsfw_module_instance_t *curInst = manager->inst;
- int unDoneNum = 0;
- while (curInst)
+ nsfw_module_instance_t *curInst = manager->inst;
+ int unDoneNum = 0;
+ while (curInst)
{
- if (curInst->stat != NSFW_INST_STAT_DONE)
+ if (curInst->stat != NSFW_INST_STAT_DONE)
{
- if (0 == unDoneNum)
+ if (0 == unDoneNum)
{
- NSFW_LOGINF ("Here is the unInited modules:");
+ NSFW_LOGINF("Here is the unInited modules:");
}
- unDoneNum++;
- nstack_framework_printInstanceInfo (curInst);
+ unDoneNum++;
+ nstack_framework_print_instance_info(curInst);
}
- curInst = curInst->next;
+ curInst = curInst->next;
}
- if (0 == unDoneNum)
- NSFW_LOGINF ("All modules are inited");
+ if (0 == unDoneNum)
+ NSFW_LOGINF("All modules are inited");
}
/**
* @Function nstack_framework_init
- * @Description This function will do framework initial work, it will invoke all initial functions
- * registered using macro NSFW_MODULE_INIT before
+ * @Description This function will do framework initial work, it will involk all initial functions
+ * registed using macro NSFW_MODULE_INIT before
* @param none
* @return 0 on success, -1 on error
*/
-int
-nstack_framework_init (void)
+int nstack_framework_init(void)
{
- int ret = -1;
- if (nsfw_module_getManager ()->done)
+ int ret = -1;
+ if (nsfw_module_get_manager()->done)
{
- goto init_finished;
+ goto init_finished;
}
- if (pthread_mutex_lock (&nsfw_module_getManager ()->initMutex))
+ if (pthread_mutex_lock(&nsfw_module_get_manager()->initMutex))
{
- return -1;
+ return -1;
}
- if (nsfw_module_getManager ()->done)
+ if (nsfw_module_get_manager()->done)
{
- goto done;
+ goto done;
}
- ret = nstack_framework_initChild_unsafe (NULL);
+ ret = nstack_framework_init_child_unsafe(NULL);
- if (0 == ret)
+ if (0 == ret)
{
- nsfw_module_getManager ()->done = 1;
+ nsfw_module_get_manager()->done = 1;
}
- else
+ else
{
- nsfw_module_getManager ()->done = -1;
+ nsfw_module_get_manager()->done = -1;
}
- // Going to print done modules and undone modules
- nstack_framework_printInitialResult ();
+ // Going to print done modules and undone modules
+ nstack_framework_print_initial_result();
-done:
- if (pthread_mutex_unlock (&nsfw_module_getManager ()->initMutex))
+ done:
+ if (pthread_mutex_unlock(&nsfw_module_get_manager()->initMutex))
{
- return -1;
+ return -1;
}
-init_finished:
- ret = nsfw_module_getManager ()->done == 1 ? 0 : -1;
- return ret;
+ init_finished:
+ ret = nsfw_module_get_manager()->done == 1 ? 0 : -1;
+ return ret;
}
/**
- * @Function nstack_framework_setModuleParam
+ * @Function nstack_framework_set_module_param
* @Description This function set parameter of module initial function parameter
* @param module - name of module
* @param param - parameter to set
* @return 0 on success, -1 on error
*/
-int
-nstack_framework_setModuleParam (char *module, void *param)
+int nstack_framework_set_module_param(char *module, void *param)
{
- nsfw_module_instance_t *inst = nsfw_module_getModuleByName (module);
- if (!inst)
- return -1;
+ nsfw_module_instance_t *inst = nsfw_module_get_module_by_name(module);
+ if (!inst)
+ return -1;
- inst->param = param;
- return 0;
+ inst->param = param;
+ return 0;
}
#ifdef __cplusplus