/***************************************************************************** PROCEDURE NAME : eds_stop_tmr DESCRIPTION : Stops the EDS timer. ARGUMENTS : tmr - ptr to the EDS timer block RETURNS : void NOTES : None *****************************************************************************/ void eds_stop_tmr(EDS_TMR *tmr) { /* If timer type is invalid just return */ if (tmr == NULL) { m_LOG_EDSV_S(EDS_TIMER_STOP_FAIL, NCSFL_LC_EDSV_INIT, NCSFL_SEV_ERROR, 0, __FILE__, __LINE__, 0); return; } else if (EDS_TMR_MAX <= tmr->type) { m_LOG_EDSV_S(EDS_TIMER_STOP_FAIL, NCSFL_LC_EDSV_INIT, NCSFL_SEV_ERROR, tmr->type, __FILE__, __LINE__, 0); return; } /* Stop the timer if it is active... */ if (tmr->is_active == TRUE) { m_NCS_TMR_STOP(tmr->tmr_id); tmr->is_active = FALSE; } /* Destroy the timer if it exists.. */ if (tmr->tmr_id != TMR_T_NULL) { m_NCS_TMR_DESTROY(tmr->tmr_id); tmr->tmr_id = TMR_T_NULL; } return; }
/***************************************************************************** PROCEDURE NAME : eds_stop_tmr DESCRIPTION : Stops the EDS timer. ARGUMENTS : tmr - ptr to the EDS timer block RETURNS : void NOTES : None *****************************************************************************/ void eds_stop_tmr(EDS_TMR *tmr) { /* If timer type is invalid just return */ if (tmr == NULL) { TRACE_4("timer is NULL"); TRACE_LEAVE(); return; } else if (EDS_TMR_MAX <= tmr->type) { TRACE_4("unsupported timer type"); TRACE_LEAVE(); return; } /* Stop the timer if it is active... */ if (tmr->is_active == true) { m_NCS_TMR_STOP(tmr->tmr_id); tmr->is_active = false; } /* Destroy the timer if it exists.. */ if (tmr->tmr_id != TMR_T_NULL) { m_NCS_TMR_DESTROY(tmr->tmr_id); tmr->tmr_id = TMR_T_NULL; } return; }
/***************************************************************************** PROCEDURE NAME : gld_stop_tmr DESCRIPTION : Stops the GLD timer. ARGUMENTS : tmr - ptr to the GLD timer block RETURNS : void NOTES : None *****************************************************************************/ void gld_stop_tmr(GLD_TMR *tmr) { /* If timer type is invalid just return */ if (tmr == NULL) { m_LOG_GLD_TIMER(GLD_TIMER_STOP_FAIL, 0, __FILE__, __LINE__); return; } if (tmr != NULL && GLD_TMR_MAX <= tmr->type) { m_LOG_GLD_TIMER(GLD_TIMER_STOP_FAIL, tmr->type, __FILE__, __LINE__); return; } /* Stop the timer if it is active... */ if (tmr->is_active == TRUE) { TRACE("Stopped GLD Timer for %d", tmr->type); m_NCS_TMR_STOP(tmr->tmr_id); tmr->is_active = FALSE; } /* Destroy the timer if it exists.. */ if (tmr->tmr_id != TMR_T_NULL) { m_NCS_TMR_DESTROY(tmr->tmr_id); tmr->tmr_id = TMR_T_NULL; } return; }
/***************************************************************************** PROCEDURE : ncs_exc_mdl_stop_timer DESCRIPTION: This function is used to stop a timer ARGUMENTS: RETURNS: Nothing. NOTES: *****************************************************************************/ void ncs_exc_mdl_stop_timer(SYSF_PID_LIST *exec_pid) { m_NCS_TMR_STOP(exec_pid->tmr_id); m_NCS_TMR_DESTROY(exec_pid->tmr_id); exec_pid->tmr_id = NULL; }
/****************************************************************************\ PROCEDURE NAME : mqd_timer_expiry_evt_process DESCRIPTION : This routine process the comp specific message. ARGUMENTS : pMqd - MQD Control block pointer nodeid - NODE ID RETURNS : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE \*****************************************************************************/ uns32 mqd_timer_expiry_evt_process(MQD_CB *pMqd, NODE_ID *nodeid) { MQD_ND_DB_NODE *pNdNode = 0; MQD_OBJ_NODE *pNode = 0; MQD_A2S_MSG msg; uns32 rc = NCSCC_RC_SUCCESS; m_LOG_MQSV_D(MQD_TMR_EXPIRED, NCSFL_LC_TIMER, NCSFL_SEV_NOTICE, NCS_PTR_TO_UNS32_CAST(nodeid), __FILE__, __LINE__); pNdNode = (MQD_ND_DB_NODE *)ncs_patricia_tree_get(&pMqd->node_db, (uns8 *)nodeid); /* We need to scan the entire database and remove the track inforamtion * pertaining to the user */ if (pNdNode == NULL) { rc = NCSCC_RC_FAILURE; return rc; } if (pMqd->ha_state == SA_AMF_HA_ACTIVE) { if (pNdNode->info.timer.tmr_id != TMR_T_NULL) { m_NCS_TMR_DESTROY(pNdNode->info.timer.tmr_id); pNdNode->info.timer.tmr_id = TMR_T_NULL; } pNode = (MQD_OBJ_NODE *)ncs_patricia_tree_getnext(&pMqd->qdb, (uns8 *)0); while (pNode) { ASAPi_DEREG_INFO dereg; SaNameT name; memset(&dereg, 0, sizeof(ASAPi_DEREG_INFO)); name = pNode->oinfo.name; if (m_NCS_NODE_ID_FROM_MDS_DEST(pNode->oinfo.info.q.dest) == pNdNode->info.nodeid) { dereg.objtype = ASAPi_OBJ_QUEUE; dereg.queue = pNode->oinfo.name; rc = mqd_asapi_dereg_hdlr(pMqd, &dereg, NULL); } pNode = (MQD_OBJ_NODE *)ncs_patricia_tree_getnext(&pMqd->qdb, (uns8 *)&name); } /* Send an async Update to the standby */ memset(&msg, 0, sizeof(MQD_A2S_MSG)); msg.type = MQD_A2S_MSG_TYPE_MQND_TIMER_EXPEVT; msg.info.nd_tmr_exp_evt.nodeid = pNdNode->info.nodeid; /* Send async update to the standby for MQD redundancy */ mqd_a2s_async_update(pMqd, MQD_A2S_MSG_TYPE_MQND_TIMER_EXPEVT, (void *)(&msg.info.nd_tmr_exp_evt)); if (pNdNode) mqd_red_db_node_del(pMqd, pNdNode); TRACE("MQND TMR EXPIRY PROCESSED ON ACTIVE"); } else if (pMqd->ha_state == SA_AMF_HA_STANDBY) { pNdNode->info.timer.is_expired = TRUE; TRACE("MQND TMR EXPIRY PROCESSED ON STANDBY"); } return rc; } /* End of mqd_timer_expiry_evt_process() */
/**************************************************************************** * Name : mqd_tmr_stop * * Description : This function which is used to stop the MQD Timer * * Arguments : tmr - Timer needs to be stoped. * * Return Values : None. * * Notes : None. *****************************************************************************/ void mqd_tmr_stop(MQD_TMR *tmr) { m_LOG_MQSV_D(MQD_TMR_STOPPED, NCSFL_LC_TIMER, NCSFL_SEV_NOTICE, 1, __FILE__, __LINE__); if (tmr->is_active == TRUE) { m_NCS_TMR_STOP(tmr->tmr_id); tmr->is_active = FALSE; } if (tmr->tmr_id != TMR_T_NULL) { m_NCS_TMR_DESTROY(tmr->tmr_id); tmr->tmr_id = TMR_T_NULL; } return; }
/**************************************************************************** * Name : mqd_tmr_stop * * Description : This function which is used to stop the MQD Timer * * Arguments : tmr - Timer needs to be stoped. * * Return Values : None. * * Notes : None. *****************************************************************************/ void mqd_tmr_stop(MQD_TMR *tmr) { TRACE_1("The timer stopped"); if (tmr->is_active == true) { m_NCS_TMR_STOP(tmr->tmr_id); tmr->is_active = false; } if (tmr->tmr_id != TMR_T_NULL) { m_NCS_TMR_DESTROY(tmr->tmr_id); tmr->tmr_id = TMR_T_NULL; } return; }
/**************************************************************************** * Name : cpd_tmr_stop * * Description : This function which is used to stop the CPD Timer * * Arguments : tmr - Timer needs to be stoped. * * Return Values : None. * * Notes : None. *****************************************************************************/ void cpd_tmr_stop(CPD_TMR *tmr) { if (tmr->is_active == true) { tmr->is_active = false; m_NCS_TMR_STOP(tmr->tmr_id); } if (tmr->tmr_id != TMR_T_NULL) { m_NCS_TMR_DESTROY(tmr->tmr_id); tmr->tmr_id = TMR_T_NULL; } return; }
/***************************************************************************** PROCEDURE : ncs_mbcsv_stop_timer DESCRIPTION: This function is used to stop a NCS_MBCSV timer ARGUMENTS: RETURNS: Nothing. NOTES: *****************************************************************************/ void ncs_mbcsv_stop_timer(PEER_INST *peer, uint32_t timer_type) { NCS_MBCSV_TMR *tmr; if (timer_type >= NCS_MBCSV_MAX_TMRS) { TRACE_LEAVE2("Timer type out of range: %u", timer_type); return; } tmr = &peer->tmr[timer_type]; /* Stop and destroy the timer if it is active... */ tmr->has_expired = false; /* if in transit, not valid now */ if (tmr->is_active == true) { TRACE("stop and destroying timer. my role:%u, svc_id:%u, pwe_hdl:%u, peer_anchor: %" PRIu64 ", tmr type:%s", peer->my_ckpt_inst->my_role, peer->my_ckpt_inst->my_mbcsv_inst->svc_id, peer->my_ckpt_inst->pwe_hdl, peer->peer_anchor, tmr_type_str[timer_type]); m_NCS_TMR_STOP(tmr->tmr_id); tmr->is_active = false; m_NCS_TMR_DESTROY(tmr->tmr_id); tmr->tmr_id = TMR_T_NULL; } else if (tmr->tmr_id != TMR_T_NULL) { /* Destroy the timer if it exists... */ TRACE("Destroying timer. my role:%u, svc_id:%u, pwe_hdl:%u, peer_anchor:%" PRIu64 ", tmr type:%s", peer->my_ckpt_inst->my_role, peer->my_ckpt_inst->my_mbcsv_inst->svc_id, peer->my_ckpt_inst->pwe_hdl, peer->peer_anchor, tmr_type_str[timer_type]); m_NCS_TMR_DESTROY(tmr->tmr_id); tmr->tmr_id = TMR_T_NULL; } }
/***************************************************************************** PROCEDURE NAME : eds_tmr_exp DESCRIPTION : EDS timer expiry callback routine.It sends corresponding timer events to EDS. ARGUMENTS : uarg - ptr to the EDS timer block RETURNS : void NOTES : None *****************************************************************************/ void eds_tmr_exp(void *uarg) { EDS_CB *eds_cb = 0; EDS_TMR *tmr = (EDS_TMR *)uarg; EDSV_EDS_EVT *evt = 0; uns32 temp_tmr_hdl; temp_tmr_hdl = tmr->cb_hdl; /* retrieve EDS CB */ if (NULL == (eds_cb = (EDS_CB *)ncshm_take_hdl(NCS_SERVICE_ID_EDS, tmr->cb_hdl))) { m_LOG_EDSV_S(EDS_CB_TAKE_HANDLE_FAILED, NCSFL_LC_EDSV_INIT, NCSFL_SEV_ERROR, 0, __FILE__, __LINE__, 0); return; } if (tmr->is_active) { tmr->is_active = FALSE; /* Destroy the timer if it exists.. */ if (tmr->tmr_id != TMR_T_NULL) { m_NCS_TMR_DESTROY(tmr->tmr_id); tmr->tmr_id = TMR_T_NULL; } /* create & send the timer event */ evt = m_MMGR_ALLOC_EDSV_EDS_EVT; if (evt) { memset(evt, '\0', sizeof(EDSV_EDS_EVT)); /* assign the timer evt */ evt->evt_type = eds_tmr_evt_map(tmr->type); evt->info.tmr_info.opq_hdl = tmr->opq_hdl; evt->cb_hdl = tmr->cb_hdl; if (NCSCC_RC_FAILURE == m_NCS_IPC_SEND(&eds_cb->mbx, evt, NCS_IPC_PRIORITY_HIGH)) { m_LOG_EDSV_S(EDS_TIMER_STOP_FAIL, NCSFL_LC_EDSV_INIT, NCSFL_SEV_ERROR, evt->cb_hdl, __FILE__, __LINE__, evt->evt_type); eds_evt_destroy(evt); } } } /* return EDS CB */ ncshm_give_hdl(temp_tmr_hdl); return; }
/***************************************************************************** PROCEDURE NAME : eds_tmr_exp DESCRIPTION : EDS timer expiry callback routine.It sends corresponding timer events to EDS. ARGUMENTS : uarg - ptr to the EDS timer block RETURNS : void NOTES : None *****************************************************************************/ void eds_tmr_exp(void *uarg) { EDS_CB *eds_cb = 0; EDS_TMR *tmr = (EDS_TMR *)uarg; EDSV_EDS_EVT *evt = 0; uint32_t temp_tmr_hdl; temp_tmr_hdl = tmr->cb_hdl; /* retrieve EDS CB */ if (NULL == (eds_cb = (EDS_CB *)ncshm_take_hdl(NCS_SERVICE_ID_EDS, tmr->cb_hdl))) { LOG_ER("Global take handle failed"); return; } if (tmr->is_active) { tmr->is_active = false; /* Destroy the timer if it exists.. */ if (tmr->tmr_id != TMR_T_NULL) { m_NCS_TMR_DESTROY(tmr->tmr_id); tmr->tmr_id = TMR_T_NULL; } /* create & send the timer event */ evt = m_MMGR_ALLOC_EDSV_EDS_EVT; if (evt) { memset(evt, '\0', sizeof(EDSV_EDS_EVT)); /* assign the timer evt */ evt->evt_type = eds_tmr_evt_map(tmr->type); evt->info.tmr_info.opq_hdl = tmr->opq_hdl; evt->cb_hdl = tmr->cb_hdl; if (NCSCC_RC_FAILURE == m_NCS_IPC_SEND(&eds_cb->mbx, evt, NCS_IPC_PRIORITY_HIGH)) { LOG_ER("IPC send failed for timer event"); eds_evt_destroy(evt); } } } /* return EDS CB */ ncshm_give_hdl(temp_tmr_hdl); return; }
/**************************************************************************** * Name : mqd_timer_expiry * * Description : This function which is registered with the OS tmr function, * which will post a message to the corresponding mailbox * depending on the component type. * *****************************************************************************/ void mqd_timer_expiry(NCSCONTEXT uarg) { MQD_TMR *tmr = (MQD_TMR *)uarg; NCS_IPC_PRIORITY priority = NCS_IPC_PRIORITY_HIGH; MQD_CB *cb; MQSV_EVT *evt = 0; uns32 mqd_hdl; if (tmr != NULL) { mqd_hdl = tmr->uarg; if (tmr->is_active) tmr->is_active = FALSE; /* Destroy the timer if it exists.. */ if (tmr->tmr_id != TMR_T_NULL) { m_NCS_TMR_DESTROY(tmr->tmr_id); tmr->tmr_id = TMR_T_NULL; } /* post a message to the corresponding component */ if ((cb = (MQD_CB *)ncshm_take_hdl(NCS_SERVICE_ID_MQD, mqd_hdl)) != NULL) { evt = m_MMGR_ALLOC_MQSV_EVT(NCS_SERVICE_ID_MQD); if (evt == NULL) { m_LOG_MQSV_D(MQD_MEMORY_ALLOC_FAIL, NCSFL_LC_TIMER, NCSFL_SEV_ERROR, 0, __FILE__, __LINE__); return; } memset(evt, 0, sizeof(MQSV_EVT)); evt->type = MQSV_EVT_MQD_CTRL; evt->msg.mqd_ctrl.type = MQD_MSG_TMR_EXPIRY; evt->msg.mqd_ctrl.info.tmr_info.nodeid = tmr->nodeid; evt->msg.mqd_ctrl.info.tmr_info.type = tmr->type; /* Post the event to MQD Thread */ m_NCS_IPC_SEND(&cb->mbx, evt, priority); ncshm_give_hdl(mqd_hdl); } } return; }
/**************************************************************************\ * exec_mod_cb_destroy * * Description : Destroys module control block. * * Call Arguments : None * * Returns: * SUCCESS/FAILURE : NCSCC_RC_SUCCESS / NCSCC_RC_FAILURE * * Notes: * \**************************************************************************/ uns32 exec_mod_cb_destroy(void) { SYSF_PID_LIST *exec_pid = NULL; uns8 pid = 0; if (module_cb.init == TRUE) { module_cb.init = FALSE; m_NCS_SIGNAL(SIGCHLD, SIG_DFL); close(module_cb.write_fd); close(module_cb.read_fd); m_NCS_TASK_RELEASE(module_cb.em_task_handle); m_NCS_LOCK(&module_cb.tree_lock, NCS_LOCK_WRITE); while (NULL != (exec_pid = (SYSF_PID_LIST *)ncs_patricia_tree_getnext(&module_cb.pid_list, (const uns8 *)&pid))) { ncs_patricia_tree_del(&module_cb.pid_list, (NCS_PATRICIA_NODE *)exec_pid); if (exec_pid->tmr_id != NULL) m_NCS_TMR_DESTROY(exec_pid->tmr_id); m_MMGR_FREE_PRO_EXC(exec_pid); } if (ncs_patricia_tree_destroy(&module_cb.pid_list) != NCSCC_RC_SUCCESS) { return m_LEAP_DBG_SINK(NCSCC_RC_FAILURE); } m_NCS_UNLOCK(&module_cb.tree_lock, NCS_LOCK_WRITE); } m_NCS_LOCK_DESTROY(&module_cb.tree_lock); return NCSCC_RC_SUCCESS; }
/****************************************************************************\ PROCEDURE NAME : mqd_timer_expiry_evt_process DESCRIPTION : This routine process the comp specific message. ARGUMENTS : pMqd - MQD Control block pointer nodeid - NODE ID RETURNS : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE \*****************************************************************************/ uint32_t mqd_timer_expiry_evt_process(MQD_CB *pMqd, NODE_ID *nodeid) { MQD_ND_DB_NODE *pNdNode = 0; MQD_OBJ_NODE *pNode = 0; MQD_A2S_MSG msg; SaImmOiHandleT immOiHandle; SaImmOiImplementerNameT implementer_name; char i_name[256] = {0}; SaVersionT imm_version = {'A',0x02,0x01}; uint32_t rc = NCSCC_RC_SUCCESS; TRACE_ENTER2("The Timer expired with node id %u", *nodeid); pNdNode = (MQD_ND_DB_NODE *)ncs_patricia_tree_get(&pMqd->node_db, (uint8_t *)nodeid); /* We need to scan the entire database and remove the track inforamtion * pertaining to the user */ if (pNdNode == NULL) { LOG_ER("MQD_ND_DB_NODE is NULL"); rc = NCSCC_RC_FAILURE; return rc; } if (pMqd->ha_state == SA_AMF_HA_ACTIVE) { rc = immutil_saImmOiInitialize_2(&immOiHandle, NULL, &imm_version); if (rc != SA_AIS_OK) LOG_ER("saImmOiInitialize_2 failed with return value=%d",rc); snprintf(i_name, SA_MAX_NAME_LENGTH, "%s%u", "MsgQueueService", *nodeid); implementer_name = i_name; rc = immutil_saImmOiImplementerSet(immOiHandle, implementer_name); if (rc != SA_AIS_OK) LOG_ER("saImmOiImplementerSet failed with return value=%d",rc); if (pNdNode->info.timer.tmr_id != TMR_T_NULL) { m_NCS_TMR_DESTROY(pNdNode->info.timer.tmr_id); pNdNode->info.timer.tmr_id = TMR_T_NULL; } pNode = (MQD_OBJ_NODE *)ncs_patricia_tree_getnext(&pMqd->qdb, (uint8_t *)0); while (pNode) { ASAPi_DEREG_INFO dereg; SaNameT name; memset(&dereg, 0, sizeof(ASAPi_DEREG_INFO)); name = pNode->oinfo.name; if (m_NCS_NODE_ID_FROM_MDS_DEST(pNode->oinfo.info.q.dest) == pNdNode->info.nodeid) { dereg.objtype = ASAPi_OBJ_QUEUE; dereg.queue = pNode->oinfo.name; rc = immutil_saImmOiRtObjectDelete(immOiHandle, &dereg.queue); if (rc != NCSCC_RC_SUCCESS) LOG_ER("Deleting MsgQGrp object %s FAILED with error %u", dereg.queue.value,rc); rc = mqd_asapi_dereg_hdlr(pMqd, &dereg, NULL); } pNode = (MQD_OBJ_NODE *)ncs_patricia_tree_getnext(&pMqd->qdb, (uint8_t *)&name); } rc = immutil_saImmOiFinalize(immOiHandle); if (rc != NCSCC_RC_SUCCESS) LOG_ER("saImmOiFinalize failed with return value=%d",rc); /* Send an async Update to the standby */ memset(&msg, 0, sizeof(MQD_A2S_MSG)); msg.type = MQD_A2S_MSG_TYPE_MQND_TIMER_EXPEVT; msg.info.nd_tmr_exp_evt.nodeid = pNdNode->info.nodeid; /* Send async update to the standby for MQD redundancy */ mqd_a2s_async_update(pMqd, MQD_A2S_MSG_TYPE_MQND_TIMER_EXPEVT, (void *)(&msg.info.nd_tmr_exp_evt)); if (pNdNode) mqd_red_db_node_del(pMqd, pNdNode); TRACE_1("MQND TMR EXPIRY PROCESSED ON ACTIVE"); } else if (pMqd->ha_state == SA_AMF_HA_STANDBY) { pNdNode->info.timer.is_expired = true; TRACE_1("MQND TMR EXPIRY PROCESSED ON STANDBY"); } TRACE_LEAVE(); return rc; } /* End of mqd_timer_expiry_evt_process() */