Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
/****************************************************************************
 * 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;
}
Ejemplo n.º 3
0
/****************************************************************************
 * 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;
}