/**************************************************************************** * Name : eds_process_evt * * Description : This is the function which is called when eds receives an * event of any kind. * * Arguments : msg - Message that was posted to the EDS Mail box. * * Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE * * Notes : None. *****************************************************************************/ uint32_t eds_process_evt(EDSV_EDS_EVT *evt) { EDS_CB *cb; TRACE_ENTER(); /* Retrieve the cb handle */ if (NULL == (cb = (EDS_CB *)ncshm_take_hdl(NCS_SERVICE_ID_EDS, evt->cb_hdl))) { TRACE_LEAVE(); return NCSCC_RC_FAILURE; } if (cb->ha_state == SA_AMF_HA_ACTIVE) { if ((evt->evt_type >= EDSV_EDS_EVT_BASE) && (evt->evt_type <= EDSV_EDS_RET_TIMER_EXP)) { /** Invoke the evt dispatcher **/ eds_edsv_top_level_evt_dispatch_tbl[evt->evt_type] (evt); } else if (evt->evt_type == EDSV_EVT_QUIESCED_ACK) { eds_proc_quiesced_ack_evt(evt); } else TRACE("Event processing failed"); } else { if ((evt->evt_type == EDSV_EDS_RET_TIMER_EXP) || (evt->evt_type == EDSV_EDS_EVT_EDA_DOWN)) /** Invoke the evt dispatcher **/ eds_edsv_top_level_evt_dispatch_tbl[evt->evt_type] (evt); } ncshm_give_hdl(evt->cb_hdl); /* Free the event */ if (NULL != evt) eds_evt_destroy(evt); TRACE_LEAVE(); return NCSCC_RC_SUCCESS; }
/**************************************************************************** * Name : eds_clear_mbx * * Description : This is the function which deletes all the messages from * the mail box. * * Arguments : arg - argument to be passed. * msg - Event start pointer. * * Return Values : true/false * * Notes : None. *****************************************************************************/ static bool eds_clear_mbx(NCSCONTEXT arg, NCSCONTEXT msg) { EDSV_EDS_EVT *pEvt = (EDSV_EDS_EVT *)msg; EDSV_EDS_EVT *pnext; pnext = pEvt; while (pnext) { pnext = ( /* (EDSV_EDS_EVT *)& */ (pEvt->next)); eds_evt_destroy(pEvt); pEvt = pnext; } return true; }
/***************************************************************************** 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 : eds_process_mbx * * Description : This is the function which process the IPC mail box of * EDS * * Arguments : mbx - This is the mail box pointer on which EDS is * going to block. * * Return Values : None. * * Notes : None. *****************************************************************************/ static void eds_process_mbx(SYSF_MBX *mbx) { EDSV_EDS_EVT *evt = NULL; evt = (EDSV_EDS_EVT *)m_NCS_IPC_NON_BLK_RECEIVE(mbx, evt); if (evt != NULL) { if ((evt->evt_type >= EDSV_EDS_EVT_BASE) && (evt->evt_type < EDSV_EDS_EVT_MAX)) { /* This event belongs to EDS main event dispatcher */ eds_process_evt(evt); } else { /* Free the event */ LOG_IN("Unsupported event type in mailbox"); eds_evt_destroy(evt); } } return; }