Esempio n. 1
0
File: qLib.c Progetto: phoboz/vmx
Q_NODE* qEach(
    Q_HEAD *pQHead,
    FUNCPTR func,
    int arg
    )
{
    return Q_EACH(pQHead, func, arg);
}
Esempio n. 2
0
Q_NODE *qEach
    (
    Q_HEAD      *pQHead,        /* queue head of queue to call routine for */
    FUNCPTR     routine,        /* the routine to call for each queue node */
    int         routineArg      /* arbitrary user-supplied argument */
    )
    {
    return (Q_EACH (pQHead, routine, routineArg));
    }
/*lint --e{533 } */
STATUS osl_waitqueue_wakeup
    (
    wait_queue_head_t semId        /* semaphore ID to give */
    )
    {
#ifndef _WRS_CONFIG_SMP
    int level;
#endif /* !_WRS_CONFIG_SMP */
	Q_NODE * pQNode = NULL;

#ifdef	_WRS_CONFIG_SMP
    /* lock has been taken in the case of ISR before here */

    if (!_WRS_INT_CONTEXT ())
#endif	/* _WRS_CONFIG_SMP */
	OBJ_LOCK (semClassId, level);

    if (OBJ_VERIFY (semId, semClassId) != OK)
	{
	OBJ_UNLOCK (semClassId, level);
	return (ERROR);
	}

	pQNode = Q_EACH(&semId->qHead, semQueueEventCheck, TRUE);

    if (pQNode == NULL)
	{
	    OBJ_UNLOCK (semClassId, level);/*lint !e2 */
	    return (OK);
	}
    else
	{
	/*lint -save -e10*/
	KERNEL_LOCK_OBJ_UNLOCK (semClassId, level);/*lint !e2 */
	/*lint -restore +e10*/
/*lint -save -e722*/
#ifdef _WRS_CONFIG_SV_INSTRUMENTATION
	/* system viewer - level 2 event logging */
	EVT_TASK_1 (EVENT_OBJ_SEMGIVE, semId);/*lint !e681 */
#endif /* _WRS_CONFIG_SV_INSTRUMENTATION */
/*lint -restore +e722*/
	semQueuePendQGet(&semId->qHead, pQNode);		/* unblock a task */

	KERNEL_UNLOCK ();

	return (OK);
	}
    }
Esempio n. 4
0
STATUS msgQInfoGet(
    MSG_Q_ID msgQId,
    MSG_Q_INFO *pInfo
    )
{
    STATUS status;
    int level;
    Q_HEAD *pendQ;

    /* Lock interrupts */
    INT_LOCK(level);

    /* Verify object class */
    if (OBJ_VERIFY(msgQId, msgQClassId) != OK)
    {
        INT_UNLOCK(level);
        status = ERROR;
    }
    else
    {
        /* If no messages */
        if (msgQId->msgQ.count == 0)
        {
            pendQ = &msgQId->msgQ.pendQ;
        }
        else
        {
            pendQ = &msgQId->freeQ.pendQ;
        }

        /* If task id list requested */
        if (pInfo->taskIdList != NULL)
        {
            Q_INFO(pendQ, pInfo->taskIdList, pInfo->taskIdListMax);
        }

        /* If message list or number requested */
        if ((pInfo->msgPtrList != NULL) || (pInfo->msgLengthList != NULL))
        {
            pInfo->numMsg = 0;
            if (pInfo->msgListMax > 0)
            {
                Q_EACH(&msgQId->msgQ, msgQInfoEach, pInfo);
            }
        }

        /* Setup info structure */
        pInfo->numMsg         = msgQId->msgQ.count;
        pInfo->numTask        = Q_INFO(pendQ, NULL, 0);
        pInfo->options        = msgQId->options;
        pInfo->maxMsg         = msgQId->maxMsg;
        pInfo->maxMsgLength   = msgQId->maxMsgLength;
        pInfo->sendTimeouts   = msgQId->sendTimeouts;
        pInfo->reciveTimeouts = msgQId->reciveTimeouts;

        /* Unlock interrupts */
        INT_UNLOCK(level);
        status = OK;
    }

    return status;
}