Example #1
0
/*
 *  ======== 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;
}