windows-nt/Source/XPSP1/NT/multimedia/media/dplayx/dplay/protocol/sendpool.c

200 lines
3.7 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1996,1997 Microsoft Corporation
Module Name:
SENDPOOL.C
Abstract:
Manages pool of send descriptors.
Author:
Aaron Ogus (aarono)
Environment:
Win32
Revision History:
Date Author Description
====== ====== ============================================================
12/10/96 aarono Original
--*/
#include <windows.h>
#include <mmsystem.h>
#include <dplay.h>
#include <dplaysp.h>
#include <dplaypr.h>
#include "mydebug.h"
#include "arpd.h"
#include "arpdint.h"
#include "macros.h"
//
// Send Descriptor Management.
//
PSEND pSendDescPool=NULL;
UINT nSendDescsAllocated=0; // Number Allocated
UINT nSendDescsInUse=0; // Number currently in use
UINT nMaxSendDescsInUse=0; // Maximum number in use since last TICK.
CRITICAL_SECTION SendDescLock;
VOID InitSendDescs(VOID)
{
InitializeCriticalSection(&SendDescLock);
}
VOID FiniSendDescs(VOID)
{
PSEND pSend;
ASSERT(nSendDescsInUse==0);
while(pSendDescPool){
pSend=pSendDescPool;
ASSERT_SIGN(pSend, SEND_SIGN);
pSendDescPool=pSendDescPool->pNext;
CloseHandle(pSend->hEvent);
DeleteCriticalSection(&pSend->SendLock);
My_GlobalFree(pSend);
nSendDescsAllocated--;
}
ASSERT(nSendDescsAllocated==0);
DeleteCriticalSection(&SendDescLock);
}
PSEND GetSendDesc(VOID)
{
PSEND pSend;
Lock(&SendDescLock);
if(!pSendDescPool){
Unlock(&SendDescLock);
pSend=(PSEND)My_GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT, sizeof(SEND));
if(pSend){
if(!(pSend->hEvent=CreateEventA(NULL, FALSE, FALSE, NULL))){
My_GlobalFree(pSend);
goto exit;
}
InitBilink(&pSend->StatList);
InitializeCriticalSection(&pSend->SendLock);
}
Lock(&SendDescLock);
if(pSend){
SET_SIGN(pSend,SEND_SIGN);
nSendDescsAllocated++;
}
} else {
pSend=pSendDescPool;
ASSERT_SIGN(pSend, SEND_SIGN);
pSendDescPool=pSendDescPool->pNext;
}
if(pSend){
InitBilink(&pSend->TimeoutList);
InitBilink(&pSend->m_GSendQ);
InitBilink(&pSend->SendQ);
nSendDescsInUse++;
if( nSendDescsInUse > nMaxSendDescsInUse ){
nMaxSendDescsInUse = nSendDescsInUse;
}
}
ASSERT(nSendDescsAllocated >= nSendDescsInUse);
Unlock(&SendDescLock);
pSend->NACKMask=0;
pSend->bCleaningUp=FALSE;
exit:
return pSend;
}
VOID ReleaseSendDesc(PSEND pSend)
{
PSENDSTAT pStat;
BILINK *pBilink;
// Dump extra statistics.
while(!EMPTY_BILINK(&pSend->StatList)){
//BUGBUG: move stats to end.
pBilink=pSend->StatList.next;
pStat=CONTAINING_RECORD(pBilink, SENDSTAT, StatList);
Delete(pBilink);
ReleaseSendStat(pStat);
}
Lock(&SendDescLock);
nSendDescsInUse--;
ASSERT(!(nSendDescsInUse&0x80000000));
pSend->pNext=pSendDescPool;
pSendDescPool=pSend;
Unlock(&SendDescLock);
}
#if 0
// let virtual memory handle this. - switched out.
LONG fInSendDescTick=0;
VOID SendDescTick(VOID)
{
PSEND pSend;
#ifdef DEBUG
LONG fLast;
#endif
// Adjusts Number of allocated buffers to
// highwater mark over the last ticks.
// Call once per delta t (around a minute).
DEBUG_BREAK(); //TRACE all paths.
if(!InterlockedExchange(&fInSendDescTick, 1)){
Lock(&SendDescLock);
while((nSendDescsAllocated > nMaxSendDescsInUse) && pSendDescPool){
pSend=pSendDescPool;
ASSERT_SIGN(pSend,SEND_SIGN);
pSendDescPool=pSendDescPool->pNext;
Unlock(&SendDescLock);
CloseHandle(pSend->hEvent);
DeleteCriticalSection(&pSend->SendLock);
My_GlobalFree(pSend);
Lock(&SendDescLock);
nSendDescsAllocated--;
}
nMaxSendDescsInUse=nSendDescsInUse;
ASSERT(nMaxSendDescsInUse <= nSendDescsAllocated);
Unlock(&SendDescLock);
#ifdef DEBUG
fLast=
#endif
InterlockedExchange(&fInSendDescTick, 0);
#ifdef DEBUG
ASSERT(fLast==1);
#endif
}
}
#endif