/* * ======== SemaphoreMP_post ======== */ Void SemaphoreMP_post(SemaphoreMP_Object *obj) { UInt tskKey; SemaphoreMP_PendElem *elem; IArg gateMPKey; Int status; /* Enter the gate */ gateMPKey = GateMP_enter((GateMP_Handle)obj->gate); if (ListMP_empty((ListMP_Handle)obj->pendQ)) { if (obj->mode == SemaphoreMP_Mode_BINARY) { obj->attrs->count = 1; } else { obj->attrs->count++; } if (obj->cacheEnabled) { Cache_wbInv(obj->attrs, sizeof(SemaphoreMP_Attrs), Cache_Type_ALL, TRUE); } /* Leave the gate */ GateMP_leave((GateMP_Handle)obj->gate, gateMPKey); return; } /* lock task scheduler */ tskKey = Task_disable(); /* dequeue tsk from semaphore queue */ elem = (SemaphoreMP_PendElem *)ListMP_getHead((ListMP_Handle)obj->pendQ); if (elem->procId != MultiProc_self()) { /* Unblock remote task */ status = Notify_sendEvent(elem->procId, 0, SemaphoreMP_notifyEventId, elem->task, TRUE); Assert_isTrue(status >= 0, ti_sdo_ipc_Ipc_A_internal); } else { /* put task back into readyQ */ Task_unblock((Task_Handle)elem->task); } /* Leave the gate */ GateMP_leave((GateMP_Handle)obj->gate, gateMPKey); Task_restore(tskKey); }
Int32 IpcFramesInLink_create(IpcFramesInLink_Obj * pObj, IpcFramesInLinkRTOS_CreateParams * pPrm) { Int32 status; System_LinkInQueParams *pInQueParams; Int i; #ifdef SYSTEM_DEBUG_IPC Vps_printf(" %d: IPC_FRAMES_IN : Create in progress !!!\n", Utils_getCurTimeInMsec()); #endif UTILS_MEMLOG_USED_START(); memcpy(&pObj->createArgs, pPrm, sizeof(pObj->createArgs)); status = System_ipcListMPOpen(pObj->createArgs.baseCreateParams.inQueParams. prevLinkId, &pObj->listMPOutHndl, &pObj->listMPInHndl); UTILS_assert(status == FVID2_SOK); UTILS_assert(pObj->listMPInHndl != NULL); while(!ListMP_empty(pObj->listMPInHndl)) { Ptr listElem = ListMP_getHead(pObj->listMPInHndl); if (listElem != NULL) { IPCFRAMESINLINK_INFO_LOG(pObj->tskId, "InList not empty!!!" "Stale entry:[%p]", listElem); } } status = Utils_queCreate(&pObj->outFrameBufQue, SYSTEM_IPC_FRAMES_MAX_LIST_ELEM, pObj->outFrameBufQueMem, UTILS_QUE_FLAG_NO_BLOCK_QUE); UTILS_assert(status == FVID2_SOK); status = Utils_queCreate(&pObj->freeFrameQue, SYSTEM_IPC_FRAMES_MAX_LIST_ELEM, pObj->freeFrameQueMem, UTILS_QUE_FLAG_NO_BLOCK_QUE); UTILS_assert(status == FVID2_SOK); for (i = 0; i < SYSTEM_IPC_FRAMES_MAX_LIST_ELEM; i++) { pObj->freeFrameMem[i].appData = &pObj->freeFrameInfoMem[i]; Utils_quePut(&pObj->freeFrameQue,&pObj->freeFrameMem[i],BIOS_NO_WAIT); } pInQueParams = &pObj->createArgs.baseCreateParams.inQueParams; status = System_linkGetInfo(pInQueParams->prevLinkId, &pObj->inQueInfo); UTILS_assert(status == FVID2_SOK); IpcFramesInLink_setOutQueInfo(pObj); IpcFramesInLink_initStats(pObj); IpcFramesInLink_createPrdObj(pObj); if (TRUE == pObj->createArgs.baseCreateParams.noNotifyMode) { if (FALSE == pObj->prd.clkStarted) { IpcFramesInLink_startPrdObj(pObj, IPC_FRAMES_IN_LINK_DONE_PERIOD_MS, FALSE); } } pObj->state = IPC_FRAMES_IN_LINK_STATE_ACTIVE; UTILS_MEMLOG_USED_END(pObj->memUsed); UTILS_MEMLOG_PRINT("IPC_FRAMES_IN", pObj->memUsed, UTILS_ARRAYSIZE(pObj->memUsed)); #ifdef SYSTEM_DEBUG_IPC Vps_printf(" %d: IPC_FRAMES_IN : Create Done !!!\n", Utils_getCurTimeInMsec()); #endif return IPC_FRAMES_IN_LINK_S_SUCCESS; }