Ejemplo n.º 1
0
DvevmStRetCode
dvtb_audDec1SemOpen(SemThread_Handle *sem_in, int valIn, SemThread_Handle *sem_out, int valOut, SemThread_Handle *sem_block, int valBlock)
{
	DvevmStRetCode retval = DVEVM_ST_SUCCESS;

	SemThread_Params semParams;

	SemThread_Params_init(&semParams);
	semParams.mode = SemThread_Mode_COUNTING;
	semParams.name = "Sem_In";
	*sem_in = SemThread_create(valIn, &semParams);

	SemThread_Params_init(&semParams);
	semParams.mode = SemThread_Mode_COUNTING;
	semParams.name = "Sem_Out";
	*sem_out = SemThread_create(valOut, &semParams);

	SemThread_Params_init(&semParams);
	semParams.mode = SemThread_Mode_BINARY;
	semParams.name = "Sem_Block";
	*sem_block = SemThread_create(valBlock, &semParams);

	if ((NULL == *sem_in) || (NULL == *sem_out) || (NULL == *sem_block))
	{
		SYS_ERROR("sem_open() FAILED\n");
		retval = DVEVM_ST_FAIL;
	}

	return retval;
}
Ejemplo n.º 2
0
/* ARGSUSED */
Void smain(UArg arg0, UArg arg1)
{
    SemThread_Params semParams;
    Task_Params      taskParams;
    Task_Handle      tsk;
    Int              i;

    Log_print0(Diags_ENTRY, "[+E] smain> Enter ");

    SemThread_Params_init(&semParams);
    done = SemThread_create(0, &semParams, NULL);

    SemThread_Params_init(&semParams);
    mutex = SemThread_create(1, &semParams, NULL);

    if ((done == NULL) || (mutex == NULL)) {
        Log_print0(Diags_USER7, "[+7] smain> SemThread creation failed");

        System_abort("SemThread_create failed \n");
    }

    Task_Params_init(&taskParams);
    /*
     *  Add the following line to have the stack allocated from the external
     *  heap:
     *      taskParams.stackHeap = (IHeap_Handle)EXTMEM_HEAP;
     */

    taskParams.stackSize = 0x1000;

    for (i = 0; i < NUMTASKS; i++) {
        Task_Params_init(&taskParams);
        taskParams.priority = attrsTable[i].priority;

        taskParams.arg0 = i + 1; /* task id */
        taskParams.arg1 = i;     /* index into attrsTable */
        tsk = Task_create((Task_FuncPtr)rmanTask, &taskParams, NULL);

        if (tsk == NULL) {

            Log_print1(Diags_USER7, "[+7] smain> Task_create of task %d failed",
                    (IArg)(i + 1));

            System_abort("Task_create() failed\n");
        }
    }

    for (i = 0; i < NUMTASKS; i++) {
        SemThread_pend(done, SemThread_FOREVER, NULL);
    }

    SemThread_delete(&mutex);
    SemThread_delete(&done);

    Log_print0(Diags_USER4, "[+4] smain> TEST PASSED ");

    Log_print0(Diags_EXIT, "[+X] smain> Exit ");
}
Ejemplo n.º 3
0
/* ARGSUSED */
Int SyncSemThread_Instance_init(SyncSemThread_Object *obj,
    const SyncSemThread_Params *params, Error_Block *eb)
{
    SemThread_Params semParams;

    /* initialize object data */
    obj->semThread = NULL;

    /* create the semaphore */
    SemThread_Params_init(&semParams);
    semParams.mode = SemThread_Mode_BINARY;
    obj->semThread = SemThread_create(0, &semParams, eb);

    return (0);
}
Ejemplo n.º 4
0
Int RcmClient_Instance_init(RcmClient_Object *obj, String server,
        const RcmClient_Params *params)
{
    Error_Block eb;
    MessageQ_Params mqParams;
    SyncSemThread_Params syncParams;
    SemThread_Params semParams;
    SemThread_Handle semHndl;
    List_Params listP;
    Int rval;
    Int status = RcmClient_S_SUCCESS;


    Log_print2(Diags_ENTRY, "--> %s: (obj=0x%x)", (IArg)FXNN, (IArg)obj);

    /* must initialize error block */
    Error_init(&eb);

    /* initialize instance data */
    obj->msgId = 0xFFFF;
    obj->sync = NULL;
    obj->serverMsgQ = MessageQ_INVALIDMESSAGEQ;
    obj->msgQue = NULL;
    obj->errorMsgQue = NULL;
    obj->mbxLock = NULL;
    obj->queueLock = NULL;
    obj->recipients = NULL;
    obj->newMail = NULL;

    /* create the instance gate */
    GateThread_construct(&obj->gate, NULL, &eb);

    if (Error_check(&eb)) {
        Log_error0(FXNN": could not create gate object");
        status = RcmClient_E_FAIL;
        goto leave;
    }

    /* create a synchronizer for the message queue */
    SyncSemThread_Params_init(&syncParams);
    obj->sync = SyncSemThread_create(&syncParams, &eb);

    if (Error_check(&eb)) {
        status = RcmClient_E_FAIL;
        goto leave;
    }

    /* create the message queue for return messages */
    MessageQ_Params_init(&mqParams);
    obj->msgQue = MessageQ_create(NULL, &mqParams);

    if (obj->msgQue == NULL) {
        Log_error0(FXNN": could not create return message queue");
        status = RcmClient_E_MSGQCREATEFAILED;
        goto leave;
    }

    /* create the message queue for error messages */
    MessageQ_Params_init(&mqParams);
    obj->errorMsgQue = MessageQ_create(NULL, &mqParams);

    if (NULL == obj->errorMsgQue) {
        Log_error0(FXNN": could not create error message queue");
        status = RcmClient_E_MSGQCREATEFAILED;
        goto leave;
    }

    /* locate server message queue */
    rval = MessageQ_open(server, (MessageQ_QueueId *)(&obj->serverMsgQ));

    if (MessageQ_E_NOTFOUND == rval) {
        Log_error1(FXNN": given server not found, server=0x%x", (IArg)server);
        status = RcmClient_E_SERVERNOTFOUND;
        goto leave;
    }
    else if (status < 0) {
        Log_error1(FXNN": could not open server message queue, server=0x%x",
            (IArg)server);
        status = RcmClient_E_MSGQOPENFAILED;
        goto leave;
    }

    /* create callback server */
    if ((obj->cbNotify = params->callbackNotification)) {
        /* TODO create callback server thread */
        /* make sure to free resources acquired by thread */
        Error_raise(&eb, Error_E_generic, "Not Implemented", 0);
        goto leave;
    }

    /* register the heapId used for message allocation */
    if ((obj->heapId = params->heapId) == RcmClient_INVALIDHEAPID) {
        Log_error0(FXNN": must specify a heap id in create params");
        status = RcmClient_E_INVALIDHEAPID;
        goto leave;
    }

    /* create the mailbox lock */
    SemThread_Params_init(&semParams);
    semHndl = SemThread_create(1, &semParams, &eb);
    if (Error_check(&eb)) {
        status = RcmClient_E_FAIL;
        goto leave;
    }
    obj->mbxLock = SemThread_Handle_upCast(semHndl);

    /* create the message queue lock */
    SemThread_Params_init(&semParams);
    semHndl = SemThread_create(1, &semParams, &eb);
    if (Error_check(&eb)) {
        status = RcmClient_E_FAIL;
        goto leave;
    }
    obj->queueLock = SemThread_Handle_upCast(semHndl);

    /* create the return message recipient list */
#if defined(RCM_ti_ipc)
    List_Params_init(&listP);
    obj->recipients = List_create(&listP, &eb);

    if (Error_check(&eb)) {
        Log_error0(FXNN": could not create list object");
        status = RcmClient_E_LISTCREATEFAILED;
        goto leave;
    }
#elif defined(RCM_ti_syslink)
    List_Params_init(&listP);
    obj->recipients = List_create(&listP, NULL);

    if (NULL == obj->recipients) {
        Log_error0(FXNN": could not create list object");
        status = RcmClient_E_LISTCREATEFAILED;
        goto leave;
    }
#endif

    /* create list of undelivered messages (new mail) */
#if defined(RCM_ti_ipc)
    List_Params_init(&listP);
    obj->newMail = List_create(&listP, &eb);

    if (Error_check(&eb)) {
        Log_error0(FXNN": could not create list object");
        status = RcmClient_E_LISTCREATEFAILED;
        goto leave;
    }
#elif defined(RCM_ti_syslink)
    List_Params_init(&listP);
    obj->newMail = List_create(&listP, NULL);

    if (NULL == obj->newMail) {
        Log_error0(FXNN": could not create list object");
        status = RcmClient_E_LISTCREATEFAILED;
        goto leave;
    }
#endif

leave:
    Log_print2(Diags_EXIT, "<-- %s: %d", (IArg)FXNN, (IArg)status);
    return(status);
}
/*
 *  ======== Processor_init ========
 */
Void Processor_init(Void)
{
    GateThread_Params params;
    Registry_Result   result;

    /*
     *  No need to reference count for Registry_addModule(), since there
     *  is no way to remove the module.
     */
    if (regInit == 0) {
        /* Register this module for logging */
        result = Registry_addModule(&ti_sdo_ce_ipc_processor_desc,
                Processor_MODNAME);
        Assert_isTrue(result == Registry_SUCCESS, (Assert_Id)NULL);

        if (result == Registry_SUCCESS) {
            /* Set the diags mask to the CE default */
            CESettings_init();
            CESettings_setDiags(Processor_MODNAME);
        }
        regInit = 1;
    }

    if (curInit != TRUE) {
        curInit = TRUE;

        /* Semaphore with count 0, will be posted when a command is present */
        dcmd.cmdPresent = SemThread_create(0, NULL, NULL);

        /* Semaphore with count 0, will be posted when reply is ready */
        dcmd.replyPresent = SemThread_create(0, NULL, NULL);

        /*
         *  Create lock to allow only one thread at a time to send command
         *  to the daemon.
         */
        GateThread_Params_init(&params);
        dcmd.gate = GateThread_create(&params, NULL);

        if ((dcmd.cmdPresent == NULL) || (dcmd.replyPresent == NULL) ||
                (dcmd.gate == NULL)) {
            // TODO: Shouldn't we abort?
            Log_print0(Diags_USER7, "[+7] Processor_init> ERROR: cannot"
                    " create semaphores or lock");
        }

        Log_print0(Diags_USER2, "[+2] Processor_init> SysLink_setup()...");

        SysLink_setup();
        Log_print0(Diags_USER2, "[+2] Processor_init> "
                "... SysLink_setup() done");

        if ((dcmd.dproc = Thread_create((Thread_RunFxn)daemon, NULL, NULL))
                == NULL) {
            Log_print0(Diags_USER7, "[+7] Processor_init> "
                    "ERROR: cannot create DSP daemon");
        }

        if (Thread_start(NULL) != TRUE) {
            Log_print0(Diags_USER7, "[+7] Processor_init> "
                    "ERROR: cannot start threads");
        }

        Global_atexit((Fxn)cleanup);
    }
}