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; }
/* 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 "); }
/* 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); }
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(¶ms); dcmd.gate = GateThread_create(¶ms, 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); } }