static uint32_t ncs_tmr_add_pat_node(SYSF_TMR *tmr) { SYSF_TMR_PAT_NODE *temp_tmr_pat_node = NULL; temp_tmr_pat_node = (SYSF_TMR_PAT_NODE *)ncs_patricia_tree_get(&gl_tcb.tmr_pat_tree, (uint8_t *)&tmr->key); if (temp_tmr_pat_node == (SYSF_TMR_PAT_NODE *)NULL) { temp_tmr_pat_node = (SYSF_TMR_PAT_NODE *)m_NCS_MEM_ALLOC(sizeof(SYSF_TMR_PAT_NODE), NCS_MEM_REGION_PERSISTENT, NCS_SERVICE_ID_LEAP_TMR, 0); memset(temp_tmr_pat_node, '\0', sizeof(SYSF_TMR_PAT_NODE)); temp_tmr_pat_node->key = tmr->key; temp_tmr_pat_node->pat_node.key_info = (uint8_t *)&temp_tmr_pat_node->key; ncs_patricia_tree_add(&gl_tcb.tmr_pat_tree, (NCS_PATRICIA_NODE *)&temp_tmr_pat_node->pat_node); } if (temp_tmr_pat_node->tmr_list_start == NULL) { temp_tmr_pat_node->tmr_list_end = temp_tmr_pat_node->tmr_list_start = tmr; } else { temp_tmr_pat_node->tmr_list_end->next = tmr; temp_tmr_pat_node->tmr_list_end = tmr; } return NCSCC_RC_SUCCESS; }
/**************************************************************************** * Function Name: sysfTmrAlloc * * Purpose: Either fetch an existing Tmr block or get one off the HEAP * ****************************************************************************/ tmr_t ncs_tmr_alloc(char *file, uint32_t line) { SYSF_TMR *tmr; SYSF_TMR *back; if (tmr_destroying == true) return NULL; if (ncslpg_take(&gl_tcb.persist) == false) /* guarentee persistence */ return NULL; m_NCS_LOCK(&gl_tcb.safe.free_lock, NCS_LOCK_WRITE); back = &gl_tcb.safe.dmy_free; /* see if we have a free one */ tmr = back->next; while (tmr != NULL) { if (TMR_TEST_STATE(tmr, TMR_STATE_DESTROY)) { TMR_STAT_RMV_FREE(gl_tcb.stats); back->next = tmr->next; /* and 'tmr' is our answer */ break; } else { back = tmr; tmr = tmr->next; } } if (tmr == NULL) { tmr = (SYSF_TMR *)m_NCS_MEM_ALLOC(sizeof(SYSF_TMR), NCS_MEM_REGION_PERSISTENT, NCS_SERVICE_ID_LEAP_TMR, 0); memset(tmr, '\0', sizeof(SYSF_TMR)); if (tmr == NULL) m_LEAP_DBG_SINK_VOID; /* can't allocate memory?? */ else { TMR_STAT_TTL_TMRS(gl_tcb.stats); tmr->keep = gl_tcb.safe.dmy_keep.keep; /* put it on keep list */ gl_tcb.safe.dmy_keep.keep = tmr; } } m_NCS_UNLOCK(&gl_tcb.safe.free_lock, NCS_LOCK_WRITE); if (tmr != NULL) { tmr->next = NULL; /* put it in start state */ TMR_SET_STATE(tmr, TMR_STATE_CREATE); TMR_DBG_SET(tmr->dbg, file, line); } ncslpg_give(&gl_tcb.persist, 0); return (tmr_t)tmr; }
/**************************************************************************** * Name : pcs_rda_reg_callback * * Description : * * * Arguments : PCS_RDA_CB_PTR - Callback function pointer * * Return Values : * * Notes : None *****************************************************************************/ static int pcs_rda_reg_callback(uns32 cb_handle, PCS_RDA_CB_PTR rda_cb_ptr, void **task_cb) { uns32 rc = PCSRDA_RC_SUCCESS; int sockfd = -1; NCS_BOOL is_task_spawned = FALSE; RDA_CALLBACK_CB *rda_callback_cb = NULL; if (*task_cb != NULL) return PCSRDA_RC_CALLBACK_ALREADY_REGD; *task_cb = (long)0; /* ** Connect */ rc = rda_connect(&sockfd); if (rc != PCSRDA_RC_SUCCESS) { return rc; } do { /* ** Init leap */ if (ncs_leap_startup() != NCSCC_RC_SUCCESS) { rc = PCSRDA_RC_LEAP_INIT_FAILED; break; } /* ** Send callback reg request messgae */ rc = rda_callback_req(sockfd); if (rc != PCSRDA_RC_SUCCESS) { break; } /* ** Allocate callback control block */ rda_callback_cb = m_NCS_MEM_ALLOC(sizeof(RDA_CALLBACK_CB), 0, 0, 0); if (rda_callback_cb == NULL) { rc = PCSRDA_RC_MEM_ALLOC_FAILED; break; } memset(rda_callback_cb, 0, sizeof(RDA_CALLBACK_CB)); rda_callback_cb->sockfd = sockfd; rda_callback_cb->callback_ptr = rda_cb_ptr; rda_callback_cb->callback_handle = cb_handle; rda_callback_cb->task_terminate = FALSE; /* ** Spawn task */ if (m_NCS_TASK_CREATE((NCS_OS_CB)rda_callback_task, rda_callback_cb, "RDATASK_CALLBACK", 0, NCS_STACKSIZE_HUGE, &rda_callback_cb->task_handle) != NCSCC_RC_SUCCESS) { m_NCS_MEM_FREE(rda_callback_cb, 0, 0, 0); rc = PCSRDA_RC_TASK_SPAWN_FAILED; break; } if (m_NCS_TASK_START(rda_callback_cb->task_handle) != NCSCC_RC_SUCCESS) { m_NCS_MEM_FREE(rda_callback_cb, 0, 0, 0); m_NCS_TASK_RELEASE(rda_callback_cb->task_handle); rc = PCSRDA_RC_TASK_SPAWN_FAILED; break; } is_task_spawned = TRUE; *task_cb = rda_callback_cb; } while (0); /* ** Disconnect */ if (!is_task_spawned) { ncs_leap_shutdown(); rda_disconnect(sockfd); } /* ** Done */ return rc; }