299 lines
8.1 KiB
C++
299 lines
8.1 KiB
C++
/*----------------------------------------------------------------------------
|
|
* File: RRCMQUEU.C
|
|
* Product: RTP/RTCP implementation.
|
|
* Description: Provides queue management function for RRCM.
|
|
*
|
|
* INTEL Corporation Proprietary Information
|
|
* This listing is supplied under the terms of a license agreement with
|
|
* Intel Corporation and may not be copied nor disclosed except in
|
|
* accordance with the terms of that agreement.
|
|
* Copyright (c) 1995 Intel Corporation.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
|
|
#include "rrcm.h"
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
/ Global Variables
|
|
/--------------------------------------------------------------------------*/
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
/ External Variables
|
|
/--------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
* Function : allocateLinkedList
|
|
* Description: Allocates all the necessary memory resource and link the
|
|
* cells to the link list.
|
|
*
|
|
* Input : *listPtr : Address of head pointer.
|
|
* hHeap : Heap to allocate the data from.
|
|
* *numCells : -> to the number of cells to allocate.
|
|
* elementSize : Element size.
|
|
* pCritSect : -> to critical section
|
|
*
|
|
* Return: TRUE = Error Code, no queues allocated and linked
|
|
* FALSE = OK
|
|
--------------------------------------------------------------------------*/
|
|
DWORD allocateLinkedList (PLINK_LIST pList,
|
|
HANDLE hHeap,
|
|
DWORD *numCells,
|
|
DWORD elementSize,
|
|
CRITICAL_SECTION *pCritSect)
|
|
{
|
|
DWORD cellsAllocated = *numCells;
|
|
PLINK_LIST pHead;
|
|
PLINK_LIST pTmp;
|
|
|
|
IN_OUT_STR ("RTCP: Enter allocateLinkedList()\n");
|
|
|
|
// allocate first cell
|
|
pHead = (PLINK_LIST)HeapAlloc (hHeap, HEAP_ZERO_MEMORY, elementSize);
|
|
if (pHead == NULL)
|
|
{
|
|
RRCM_DBG_MSG ("RTCP: ERROR - Resource allocation failed", 0,
|
|
__FILE__, __LINE__, DBG_CRITICAL);
|
|
|
|
IN_OUT_STR ("RTCP: Exit allocateLinkedList()\n");
|
|
return (RRCMError_RTCPResources);
|
|
}
|
|
|
|
// protect the pointers
|
|
EnterCriticalSection (pCritSect);
|
|
|
|
// initialize list tail pointer
|
|
pList->prev = pHead;
|
|
|
|
// update number of cells allocated
|
|
cellsAllocated--;
|
|
|
|
while (cellsAllocated)
|
|
{
|
|
cellsAllocated--;
|
|
|
|
pHead->next = (PLINK_LIST)HeapAlloc (hHeap, HEAP_ZERO_MEMORY,
|
|
elementSize);
|
|
if (pHead->next == NULL)
|
|
break;
|
|
|
|
// save head pointer
|
|
pTmp = pHead;
|
|
|
|
// update head ptr
|
|
pHead = pHead->next;
|
|
pHead->prev = pTmp;
|
|
}
|
|
|
|
// set number of cells allocated
|
|
*numCells -= cellsAllocated;
|
|
|
|
// set head/tail pointers
|
|
pList->next = pHead;
|
|
|
|
// unprotect the pointers
|
|
LeaveCriticalSection (pCritSect);
|
|
|
|
IN_OUT_STR ("RTCP: Exit allocateLinkedList()\n");
|
|
|
|
return (RRCM_NoError);
|
|
}
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
** Function : addToHeadOfList
|
|
** Description: Add a new cell to the specified queue. The queue acts as a
|
|
** FIFO (cells enqueud on the next pointer and dequeued by the
|
|
** starting address of the queue).
|
|
**
|
|
** Input : pHead = Address of head pointer of queue.
|
|
** pNew = Cell address to be added to the linked list.
|
|
** pCritSect = -> to critical section object.
|
|
**
|
|
** Return: None.
|
|
--------------------------------------------------------------------------*/
|
|
void addToHeadOfList (PLINK_LIST pHead,
|
|
PLINK_LIST pNew,
|
|
CRITICAL_SECTION *pCritSect)
|
|
{
|
|
ASSERT (pHead);
|
|
ASSERT (pNew);
|
|
|
|
IN_OUT_STR ("RTCP: Enter addToHeadOfList()\n");
|
|
|
|
// safe access to pointers
|
|
EnterCriticalSection (pCritSect);
|
|
|
|
if (pHead->next == NULL)
|
|
{
|
|
// head is NULL for the first cell. Assign the address of
|
|
// the free cell
|
|
pHead->next = pHead->prev = pNew;
|
|
pNew->next = pNew->prev = NULL;
|
|
}
|
|
else
|
|
// head ptr points to something
|
|
{
|
|
pNew->prev = pHead->next;
|
|
(pHead->next)->next = pNew;
|
|
pNew->next = NULL;
|
|
|
|
// update the head pointer now
|
|
pHead->next = pNew;
|
|
}
|
|
|
|
// unlock pointer access
|
|
LeaveCriticalSection (pCritSect);
|
|
|
|
IN_OUT_STR ("RTCP: Exit addToHeadOfList()\n");
|
|
}
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
** Function : addToTailOfList
|
|
** Description: Add a new cell to the specified queue. The queue acts as a
|
|
** FIFO (cells enqueud on the next pointer and dequeued by the
|
|
** starting address of the queue).
|
|
**
|
|
** Input : pTail = Address of tail pointer to enqueue in.
|
|
** pNew = New cell address to be added to the linked list.
|
|
**
|
|
** Return: None.
|
|
--------------------------------------------------------------------------*/
|
|
void addToTailOfList (PLINK_LIST pTail,
|
|
PLINK_LIST pNew,
|
|
CRITICAL_SECTION *pCritSect)
|
|
{
|
|
ASSERT (pTail);
|
|
ASSERT (pNew);
|
|
|
|
IN_OUT_STR ("RTCP: Enter addToTailOfList()\n");
|
|
|
|
// safe access to pointers
|
|
EnterCriticalSection (pCritSect);
|
|
|
|
if (pTail->prev == NULL)
|
|
{
|
|
// head is NULL for the first cell. Assign the address of
|
|
// the free cell
|
|
pTail->next = pTail->prev = pNew;
|
|
pNew->next = pNew->prev = NULL;
|
|
}
|
|
else
|
|
// tail ptr points to something
|
|
{
|
|
pNew->next = pTail->prev;
|
|
(pTail->prev)->prev = pNew;
|
|
pNew->prev = NULL;
|
|
|
|
// update the parent tail pointer now
|
|
pTail->prev = pNew;
|
|
}
|
|
|
|
// unlock pointer access
|
|
LeaveCriticalSection (pCritSect);
|
|
|
|
IN_OUT_STR ("RTCP: Exit addToTailOfList()\n");
|
|
}
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
** Function : removePcktFromHead
|
|
** Description: Remove a cell from front of the specified queue.
|
|
**
|
|
** Input : pQueue: -> to the list to remove the packet from
|
|
**
|
|
** Return: NULL ==> Empty queue.
|
|
** Buffer Address ==> OK, cell removed
|
|
--------------------------------------------------------------------------*/
|
|
PLINK_LIST removePcktFromHead (PLINK_LIST pQueue,
|
|
CRITICAL_SECTION *pCritSect)
|
|
{
|
|
PLINK_LIST pReturnQ;
|
|
|
|
IN_OUT_STR ("RTCP: Enter removePcktFromHead()\n");
|
|
|
|
// safe access to pointers
|
|
EnterCriticalSection (pCritSect);
|
|
|
|
if ((pReturnQ = pQueue->next) != NULL)
|
|
{
|
|
// We have a buffer. If this is the last buffer in the queue,
|
|
// mark it empty.
|
|
if (pReturnQ->prev == NULL)
|
|
{
|
|
pQueue->prev = NULL;
|
|
pQueue->next = NULL;
|
|
}
|
|
else
|
|
{
|
|
// Have the new head buffer point to NULL
|
|
(pReturnQ->prev)->next = NULL;
|
|
// Have the queue head point to the new head buffer
|
|
pQueue->next = pReturnQ->prev;
|
|
}
|
|
}
|
|
|
|
// unlock pointer access
|
|
LeaveCriticalSection (pCritSect);
|
|
|
|
IN_OUT_STR ("RTCP: Exit removePcktFromHead()\n");
|
|
|
|
return (pReturnQ);
|
|
}
|
|
|
|
|
|
/*--------------------------------------------------------------------------
|
|
** Function : removePcktFromTail
|
|
** Description: Remove a cell from end of the specified queue.
|
|
**
|
|
** Input : pQueue: -> to the list to remove the packet from
|
|
**
|
|
** Return: NULL ==> Empty queue.
|
|
** Buffer Address ==> OK, cell removed
|
|
--------------------------------------------------------------------------*/
|
|
PLINK_LIST removePcktFromTail (PLINK_LIST pQueue,
|
|
CRITICAL_SECTION *pCritSect)
|
|
{
|
|
PLINK_LIST pReturnQ;
|
|
|
|
IN_OUT_STR ("RTCP: Enter removePcktFromTail()\n");
|
|
|
|
// safe access to pointers
|
|
EnterCriticalSection (pCritSect);
|
|
|
|
if ((pReturnQ = pQueue->prev) != NULL)
|
|
{
|
|
// We have a buffer. If this is the last buffer in the queue,
|
|
// mark it empty.
|
|
if (pReturnQ->next == NULL)
|
|
{
|
|
pQueue->prev = NULL;
|
|
pQueue->next = NULL;
|
|
}
|
|
else
|
|
{
|
|
// In any event, the new prev pointer is NULL: end of list
|
|
(pReturnQ->next)->prev = NULL;
|
|
// have the queue prev pointer point to the new 'last' element
|
|
pQueue->prev = pReturnQ->next;
|
|
}
|
|
}
|
|
|
|
// unlock pointer access
|
|
LeaveCriticalSection (pCritSect);
|
|
|
|
IN_OUT_STR ("RTCP: Enter removePcktFromTail()\n");
|
|
|
|
return (pReturnQ);
|
|
}
|
|
|
|
|
|
|
|
// [EOF]
|
|
|