osaf/services/saf/avsv/avnd/avnd_clc.c | 63 ++++++++++++++++-----------------
1 files changed, 31 insertions(+), 32 deletions(-)
At present when clc response event comes AMFND searches whole component
database and matches the context.
This context does not include component name. Thus AMFND can associate clc
response with wrong component.
The patch ensures that AMFND gets component name in the clc response event and
thus solves the problem
by associating clc response event with the component.
diff --git a/osaf/services/saf/avsv/avnd/avnd_clc.c
b/osaf/services/saf/avsv/avnd/avnd_clc.c
--- a/osaf/services/saf/avsv/avnd/avnd_clc.c
+++ b/osaf/services/saf/avsv/avnd/avnd_clc.c
@@ -316,17 +316,9 @@ uint32_t avnd_evt_clc_resp_evh(AVND_CB *
/* get the comp */
if (clc_evt->exec_ctxt) {
- /* => cmd successfully launched (scan the entire comp-database)
*/
- for (comp = (AVND_COMP *)ncs_patricia_tree_getnext(&cb->compdb,
- (uint8_t
*)0); comp;
- comp = (AVND_COMP *)ncs_patricia_tree_getnext(&cb->compdb,
(uint8_t *)&comp->name)) {
- if (comp->clc_info.cmd_exec_ctxt == clc_evt->exec_ctxt)
- break;
- if (comp->clc_info.am_cmd_exec_ctxt ==
clc_evt->exec_ctxt) {
- amcmd = 1;
- break;
- }
- }
+ comp = m_AVND_COMPDB_REC_GET(cb->compdb, clc_evt->comp_name);
+ if (comp->clc_info.am_cmd_exec_ctxt == clc_evt->exec_ctxt)
+ amcmd = 1;
} else
/* => cmd did not launch successfully (comp is available) */
comp = m_AVND_COMPDB_REC_GET(cb->compdb, clc_evt->comp_name);
@@ -637,7 +629,7 @@ done:
******************************************************************************/
uint32_t avnd_comp_clc_resp(NCS_OS_PROC_EXECUTE_TIMED_CB_INFO *info)
{
- AVND_CLC_EVT clc_evt;
+ AVND_CLC_EVT *clc_evt = (AVND_CLC_EVT *)info->i_usr_hdl;
AVND_EVT *evt = 0;
uint32_t rc = NCSCC_RC_SUCCESS;
TRACE_ENTER();
@@ -645,14 +637,11 @@ uint32_t avnd_comp_clc_resp(NCS_OS_PROC_
if (!info)
goto done;
- memset(&clc_evt, 0, sizeof(AVND_CLC_EVT));
-
/* fill the clc-evt param */
- clc_evt.exec_ctxt = info->i_exec_hdl;
- clc_evt.exec_stat = info->exec_stat;
+ clc_evt->exec_stat = info->exec_stat;
/* create the event */
- evt = avnd_evt_create(avnd_cb, AVND_EVT_CLC_RESP, 0, 0, 0, (void
*)&clc_evt, 0);
+ evt = avnd_evt_create(avnd_cb, AVND_EVT_CLC_RESP, 0, 0, 0, (void
*)clc_evt, 0);
if (!evt) {
rc = NCSCC_RC_FAILURE;
goto done;
@@ -662,6 +651,7 @@ uint32_t avnd_comp_clc_resp(NCS_OS_PROC_
rc = avnd_evt_send(avnd_cb, evt);
done:
+ free(clc_evt);
/* free the event */
if (NCSCC_RC_SUCCESS != rc && evt)
avnd_evt_destroy(evt);
@@ -2508,7 +2498,7 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_
char env_var_nodeid[] = "NCS_ENV_NODE_ID";
char env_var_comp_err[] = "NCS_ENV_COMPONENT_ERROR_SRC";
char *env_attr_val = 0;
- AVND_CLC_EVT clc_evt;
+ AVND_CLC_EVT *clc_evt;
AVND_EVT *evt = 0;
AVND_COMP_CLC_INFO *clc_info = &comp->clc_info;
char scr[SAAMF_CLC_LEN];
@@ -2528,15 +2518,16 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_
goto err;
}
+ clc_evt = (AVND_CLC_EVT *)calloc(1, sizeof(AVND_CLC_EVT));
+ memcpy(&clc_evt->comp_name, &comp->name, sizeof(SaNameT));
/* For external component, there is no cleanup command. So, we will
send a
SUCCESS message to the mail box for external components. There
wouldn't
be any other command for external component comming. */
if (true == comp->su->su_is_external) {
if (AVND_COMP_CLC_CMD_TYPE_CLEANUP == cmd_type) {
- memset(&clc_evt, 0, sizeof(AVND_CLC_EVT));
- memcpy(&clc_evt.comp_name, &comp->name,
sizeof(SaNameT));
- clc_evt.cmd_type = cmd_type;
- clc_evt.exec_stat.value = NCS_OS_PROC_EXIT_NORMAL;
+ memcpy(&clc_evt->comp_name, &comp->name,
sizeof(SaNameT));
+ clc_evt->cmd_type = cmd_type;
+ clc_evt->exec_stat.value = NCS_OS_PROC_EXIT_NORMAL;
clc_info->exec_cmd = cmd_type;
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp,
AVND_CKPT_COMP_EXEC_CMD);
@@ -2545,17 +2536,21 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp,
AVND_CKPT_COMP_CMD_EXEC_CTXT);
/* create the event */
- evt = avnd_evt_create(cb, AVND_EVT_CLC_RESP, 0, 0, 0,
(void *)&clc_evt, 0);
+ evt = avnd_evt_create(cb, AVND_EVT_CLC_RESP, 0, 0, 0,
(void *)clc_evt, 0);
if (!evt) {
+ free(clc_evt);
rc = NCSCC_RC_FAILURE;
goto err;
}
/* send the event */
rc = avnd_evt_send(cb, evt);
- if (NCSCC_RC_SUCCESS != rc)
+ if (NCSCC_RC_SUCCESS != rc) {
+ free(clc_evt);
goto err;
-
+ }
+
+ free(clc_evt);
return rc;
} else {
LOG_ER("Command other than cleanup recvd for ext comp:
Comp and cmd_type are '%s': %u",\
@@ -2682,6 +2677,7 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_
cmd_info.i_timeout_in_ms = (uint32_t)((clc_info->cmds[cmd_type -
1].timeout) / 1000000);
cmd_info.i_cb = avnd_comp_clc_resp;
cmd_info.i_set_env_args = &arg;
+ cmd_info.i_usr_hdl = (NCS_EXEC_USR_HDL) clc_evt;
TRACE_1("CLC CLI script:'%s'",cmd_info.i_script);
for(count=1;count<argc;count++)
@@ -2707,29 +2703,32 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_
if (NCSCC_RC_SUCCESS != rc) {
TRACE_2("The CLC CLI command execution failed");
/* generate a cmd failure event; it'll be executed
asynchronously */
- memset(&clc_evt, 0, sizeof(AVND_CLC_EVT));
/* fill the clc-evt param */
- memcpy(&clc_evt.comp_name, &comp->name, sizeof(SaNameT));
- clc_evt.cmd_type = cmd_type;
+ memcpy(&clc_evt->comp_name, &comp->name, sizeof(SaNameT));
+ clc_evt->cmd_type = cmd_type;
/* create the event */
- evt = avnd_evt_create(cb, AVND_EVT_CLC_RESP, 0, 0, 0, (void
*)&clc_evt, 0);
+ evt = avnd_evt_create(cb, AVND_EVT_CLC_RESP, 0, 0, 0, (void
*)clc_evt, 0);
if (!evt) {
+ free(clc_evt);
rc = NCSCC_RC_FAILURE;
goto err;
}
/* send the event */
rc = avnd_evt_send(cb, evt);
- if (NCSCC_RC_SUCCESS != rc)
+ if (NCSCC_RC_SUCCESS != rc) {
+ free(clc_evt);
goto err;
+ }
+ free(clc_evt);
} else {
TRACE_2("The CLC CLI command execution success");
if (cmd_type == AVND_COMP_CLC_CMD_TYPE_AMSTART || cmd_type ==
AVND_COMP_CLC_CMD_TYPE_AMSTOP)
- clc_info->am_cmd_exec_ctxt = cmd_info.o_exec_hdl;
+ clc_info->am_cmd_exec_ctxt =
(NCS_EXEC_HDL)cmd_info.i_usr_hdl;
else {
- clc_info->cmd_exec_ctxt = cmd_info.o_exec_hdl;
+ clc_info->cmd_exec_ctxt =
(NCS_EXEC_HDL)cmd_info.i_usr_hdl;
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp,
AVND_CKPT_COMP_CMD_EXEC_CTXT);
}
}
------------------------------------------------------------------------------
Get your SQL database under version control now!
Version control is standard for application code, but databases havent
caught up. So what steps can you take to put your SQL databases under
version control? Why should you start doing it? Read more to find out.
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel