windows-nt/Source/XPSP1/NT/multimedia/media/dplayx/dplay/protocol/statpool.c
2020-09-26 16:20:57 +08:00

167 lines
3 KiB
C

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
STATPOOL.CPP
Abstract:
Maintains pool of Stat structures.
Author:
Aaron Ogus (aarono)
Environment:
Win32/COM
Revision History:
Date Author Description
======= ====== ============================================================
1/30/97 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"
PSENDSTAT pSendStatPool=NULL;
UINT nSendStatsAllocated=0; // Number Allocated
UINT nSendStatsInUse=0; // Number currently in use
UINT nMaxSendStatsInUse=0; // Maximum number in use since last TICK.
CRITICAL_SECTION SendStatLock;
VOID InitSendStats(VOID)
{
InitializeCriticalSection(&SendStatLock);
}
VOID FiniSendStats(VOID)
{
PSENDSTAT pSendStat;
ASSERT(nSendStatsInUse==0);
while(pSendStatPool){
pSendStat=pSendStatPool;
ASSERT_SIGN(pSendStat, SENDSTAT_SIGN);
pSendStatPool=pSendStatPool->pNext;
My_GlobalFree(pSendStat);
nSendStatsAllocated--;
}
ASSERT(nSendStatsAllocated==0);
DeleteCriticalSection(&SendStatLock);
}
PSENDSTAT GetSendStat(VOID)
{
PSENDSTAT pSendStat;
Lock(&SendStatLock);
if(!pSendStatPool){
Unlock(&SendStatLock);
pSendStat=(PSENDSTAT)My_GlobalAlloc(GMEM_FIXED, sizeof(SENDSTAT));
Lock(&SendStatLock);
if(pSendStat){
SET_SIGN(pSendStat,SENDSTAT_SIGN);
nSendStatsAllocated++;
}
} else {
pSendStat=pSendStatPool;
ASSERT_SIGN(pSendStat, SENDSTAT_SIGN);
pSendStatPool=pSendStatPool->pNext;
}
if(pSendStat){
nSendStatsInUse++;
if( nSendStatsInUse > nMaxSendStatsInUse ){
nMaxSendStatsInUse = nSendStatsInUse;
}
}
ASSERT(nSendStatsAllocated >= nSendStatsInUse);
Unlock(&SendStatLock);
return pSendStat;
}
VOID ReleaseSendStat(PSENDSTAT pSendStat)
{
Lock(&SendStatLock);
nSendStatsInUse--;
ASSERT(!(nSendStatsInUse&0x80000000));
pSendStat->pNext=pSendStatPool;
pSendStatPool=pSendStat;
Unlock(&SendStatLock);
}
#if 0
// let virtual memory handle this.
LONG fInSendStatTick=0;
VOID SendStatTick(VOID)
{
PSENDSTAT pSendStat;
#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(&fInSendStatTick, 1)){
Lock(&SendStatLock);
while((nSendStatsAllocated > nMaxSendStatsInUse) && pSendStatPool){
pSendStat=pSendStatPool;
ASSERT_SIGN(pSendStat,SENDSTAT_SIGN);
pSendStatPool=pSendStatPool->pNext;
Unlock(&SendStatLock);
My_GlobalFree(pSendStat);
Lock(&SendStatLock);
nSendStatsAllocated--;
}
nMaxSendStatsInUse=nSendStatsInUse;
ASSERT(nMaxSendStatsInUse <= nSendStatsAllocated);
Unlock(&SendStatLock);
#ifdef DEBUG
fLast=
#endif
InterlockedExchange(&fInSendStatTick, 0);
#ifdef DEBUG
ASSERT(fLast==1);
#endif
}
}
#endif