Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

382 lines
10 KiB

/*==========================================================================
*
* Copyright (C) 2000-2002 Microsoft Corporation. All Rights Reserved.
*
* File: Pools.cpp
* Content: Pool utility functions
*
*
* History:
* Date By Reason
* ==== == ======
* 01/20/2000 jtk Derived from Utils.h
***************************************************************************/
#include "dnwsocki.h"
//**********************************************************************
// Constant definitions
//**********************************************************************
//**********************************************************************
// Macro definitions
//**********************************************************************
//**********************************************************************
// Structure definitions
//**********************************************************************
//**********************************************************************
// Variable definitions
//**********************************************************************
#ifndef DPNBUILD_ONLYONETHREAD
static DNCRITICAL_SECTION g_AddressLock;
#endif // !DPNBUILD_ONLYONETHREAD
// Pools
#ifndef DPNBUILD_ONLYONEADAPTER
CFixedPool g_AdapterEntryPool;
#endif // ! DPNBUILD_ONLYONEADAPTER
CFixedPool g_CommandDataPool;
CFixedPool g_SocketAddressPool;
CFixedPool g_EndpointPool;
CFixedPool g_EndpointCommandParametersPool;
CFixedPool g_SocketPortPool;
CFixedPool g_ThreadPoolPool;
CFixedPool g_ReadIODataPool;
CFixedPool g_TimerEntryPool;
CFixedPool g_SocketDataPool;
#ifndef DPNBUILD_ONLYONETHREAD
CFixedPool g_BlockingJobPool;
#endif // ! DPNBUILD_ONLYONETHREAD
#ifndef DPNBUILD_ONLYONEADAPTER
#define ADAPTERENTRY_POOL_INITED 0x00000001
#endif // ! DPNBUILD_ONLYONEADAPTER
#define COMMANDDATA_POOL_INITED 0x00000002
#define ADDRESS_LOCK_INITED 0x00000004
#define SOCKETADDRESS_POOL_INITED 0x00000008
#define ENDPOINT_POOL_INITED 0x00000010
#define EPCMDPARAM_POOL_INITED 0x00000020
#define SOCKETPORT_POOL_INITED 0x00000040
#define THREADPOOL_POOL_INITED 0x00000080
#define READ_POOL_INITED 0x00000100
#define TIMERENTRY_POOL_INITED 0x00000200
#define SOCKETDATA_POOL_INITED 0x00000400
#ifndef DPNBUILD_ONLYONETHREAD
#define BLOCKINGJOB_POOL_INITED 0x00000800
#endif // ! DPNBUILD_ONLYONETHREAD
DWORD g_dwWsockInitFlags = 0;
//**********************************************************************
// Function prototypes
//**********************************************************************
//**********************************************************************
// Function definitions
//**********************************************************************
//**********************************************************************
// ------------------------------
// InitializePools - initialize pools
//
// Entry: Nothing
//
// Exit: Boolean indicating success
// TRUE = success
// FALSE = failure
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "InitializePools"
BOOL InitializePools( void )
{
#ifndef DPNBUILD_ONLYONEADAPTER
//
// AdapterEntry object pool
//
if (!g_AdapterEntryPool.Initialize(sizeof(CAdapterEntry),
CAdapterEntry::PoolAllocFunction,
CAdapterEntry::PoolInitFunction,
CAdapterEntry::PoolReleaseFunction,
CAdapterEntry::PoolDeallocFunction))
{
goto Failure;
}
g_dwWsockInitFlags |= ADAPTERENTRY_POOL_INITED;
#endif // ! DPNBUILD_ONLYONEADAPTER
//
// command data pool
//
if (!g_CommandDataPool.Initialize(sizeof(CCommandData),
CCommandData::PoolAllocFunction,
CCommandData::PoolInitFunction,
CCommandData::PoolReleaseFunction,
CCommandData::PoolDeallocFunction))
{
goto Failure;
}
g_dwWsockInitFlags |= COMMANDDATA_POOL_INITED;
//
// initialize lock for address and endpoint pools
//
if ( DNInitializeCriticalSection( &g_AddressLock ) == FALSE )
{
goto Failure;
}
DebugSetCriticalSectionRecursionCount( &g_AddressLock, 0 );
DebugSetCriticalSectionGroup( &g_AddressLock, &g_blDPNWSockCritSecsHeld ); // separate dpnwsock CSes from the rest of DPlay's CSes
g_dwWsockInitFlags |= ADDRESS_LOCK_INITED;
//
// address pools
//
if (!g_SocketAddressPool.Initialize(sizeof(CSocketAddress),
CSocketAddress::PoolAllocFunction,
CSocketAddress::PoolGetFunction,
CSocketAddress::PoolReturnFunction,
NULL))
{
goto Failure;
}
g_dwWsockInitFlags |= SOCKETADDRESS_POOL_INITED;
//
// endpoint pools
//
if (!g_EndpointPool.Initialize(sizeof(CEndpoint),
CEndpoint::PoolAllocFunction,
CEndpoint::PoolInitFunction,
CEndpoint::PoolReleaseFunction,
CEndpoint::PoolDeallocFunction))
{
goto Failure;
}
g_dwWsockInitFlags |= ENDPOINT_POOL_INITED;
//
// endpoint command parameter pools
//
if (!g_EndpointCommandParametersPool.Initialize(sizeof(ENDPOINT_COMMAND_PARAMETERS),
NULL,
ENDPOINT_COMMAND_PARAMETERS::PoolInitFunction,
NULL,
NULL))
{
goto Failure;
}
g_dwWsockInitFlags |= EPCMDPARAM_POOL_INITED;
//
// socket port pool
//
if (!g_SocketPortPool.Initialize(sizeof(CSocketPort),
CSocketPort::PoolAllocFunction,
CSocketPort::PoolInitFunction,
#ifdef DBG
CSocketPort::PoolDeinitFunction,
#else // ! DBG
NULL,
#endif // ! DBG
CSocketPort::PoolDeallocFunction))
{
goto Failure;
}
g_dwWsockInitFlags |= SOCKETPORT_POOL_INITED;
//
// thread pool pool
//
if (!g_ThreadPoolPool.Initialize(sizeof(CThreadPool),
CThreadPool::PoolAllocFunction,
NULL,
NULL,
CThreadPool::PoolDeallocFunction))
{
goto Failure;
}
g_dwWsockInitFlags |= THREADPOOL_POOL_INITED;
// pool of read requests
if (!g_ReadIODataPool.Initialize( sizeof(CReadIOData),
CReadIOData::ReadIOData_Alloc,
CReadIOData::ReadIOData_Get,
CReadIOData::ReadIOData_Release,
CReadIOData::ReadIOData_Dealloc))
{
goto Failure;
}
g_dwWsockInitFlags |= READ_POOL_INITED;
// timer entry pool
if (!g_TimerEntryPool.Initialize( sizeof(TIMER_OPERATION_ENTRY),
TimerEntry_Alloc, // function called on pool entry initial allocation
TimerEntry_Get, // function called on entry extraction from pool
TimerEntry_Release, // function called on entry return to pool
TimerEntry_Dealloc // function called on entry free
))
{
goto Failure;
}
g_dwWsockInitFlags |= TIMERENTRY_POOL_INITED;
// socket data pool
if (!g_SocketDataPool.Initialize( sizeof(CSocketData),
CSocketData::PoolAllocFunction,
CSocketData::PoolInitFunction,
CSocketData::PoolReleaseFunction,
CSocketData::PoolDeallocFunction
))
{
goto Failure;
}
g_dwWsockInitFlags |= SOCKETDATA_POOL_INITED;
#ifndef DPNBUILD_ONLYONETHREAD
// blocking job pool
if (!g_BlockingJobPool.Initialize( sizeof(BLOCKING_JOB),
NULL,
NULL,
NULL,
NULL))
{
goto Failure;
}
g_dwWsockInitFlags |= BLOCKINGJOB_POOL_INITED;
#endif // ! DPNBUILD_ONLYONETHREAD
return TRUE;
Failure:
DeinitializePools();
return FALSE;
}
//**********************************************************************
//**********************************************************************
// ------------------------------
// DeinitializePools - deinitialize the pools
//
// Entry: Nothing
//
// Exit: Nothing
// ------------------------------
#undef DPF_MODNAME
#define DPF_MODNAME "DeinitializePools"
void DeinitializePools( void )
{
if (g_dwWsockInitFlags & READ_POOL_INITED)
{
g_ReadIODataPool.DeInitialize();
#ifdef DBG
g_dwWsockInitFlags &= ~READ_POOL_INITED;
#endif // DBG
}
if (g_dwWsockInitFlags & TIMERENTRY_POOL_INITED)
{
g_TimerEntryPool.DeInitialize();
#ifdef DBG
g_dwWsockInitFlags &= ~TIMERENTRY_POOL_INITED;
#endif // DBG
}
if (g_dwWsockInitFlags & THREADPOOL_POOL_INITED)
{
g_ThreadPoolPool.DeInitialize();
#ifdef DBG
g_dwWsockInitFlags &= ~THREADPOOL_POOL_INITED;
#endif // DBG
}
if (g_dwWsockInitFlags & SOCKETPORT_POOL_INITED)
{
g_SocketPortPool.DeInitialize();
#ifdef DBG
g_dwWsockInitFlags &= ~SOCKETPORT_POOL_INITED;
#endif // DBG
}
if (g_dwWsockInitFlags & EPCMDPARAM_POOL_INITED)
{
g_EndpointCommandParametersPool.DeInitialize();
#ifdef DBG
g_dwWsockInitFlags &= ~EPCMDPARAM_POOL_INITED;
#endif // DBG
}
if (g_dwWsockInitFlags & ENDPOINT_POOL_INITED)
{
g_EndpointPool.DeInitialize();
#ifdef DBG
g_dwWsockInitFlags &= ~ENDPOINT_POOL_INITED;
#endif // DBG
}
if (g_dwWsockInitFlags & SOCKETADDRESS_POOL_INITED)
{
g_SocketAddressPool.DeInitialize();
#ifdef DBG
g_dwWsockInitFlags &= ~SOCKETADDRESS_POOL_INITED;
#endif // DBG
}
if (g_dwWsockInitFlags & ADDRESS_LOCK_INITED)
{
DNDeleteCriticalSection( &g_AddressLock );
#ifdef DBG
g_dwWsockInitFlags &= ~ADDRESS_LOCK_INITED;
#endif // DBG
}
if (g_dwWsockInitFlags & COMMANDDATA_POOL_INITED)
{
g_CommandDataPool.DeInitialize();
#ifdef DBG
g_dwWsockInitFlags &= ~COMMANDDATA_POOL_INITED;
#endif // DBG
}
#ifndef DPNBUILD_ONLYONEADAPTER
if (g_dwWsockInitFlags & ADAPTERENTRY_POOL_INITED)
{
g_AdapterEntryPool.DeInitialize();
#ifdef DBG
g_dwWsockInitFlags &= ~ADAPTERENTRY_POOL_INITED;
#endif // DBG
}
#endif // ! DPNBUILD_ONLYONEADAPTER
if (g_dwWsockInitFlags & SOCKETDATA_POOL_INITED)
{
g_SocketDataPool.DeInitialize();
#ifdef DBG
g_dwWsockInitFlags &= ~SOCKETDATA_POOL_INITED;
#endif // DBG
}
#ifndef DPNBUILD_ONLYONETHREAD
if (g_dwWsockInitFlags & BLOCKINGJOB_POOL_INITED)
{
g_BlockingJobPool.DeInitialize();
#ifdef DBG
g_dwWsockInitFlags &= ~BLOCKINGJOB_POOL_INITED;
#endif // DBG
}
#endif // ! DPNBUILD_ONLYONETHREAD
DNASSERT(g_dwWsockInitFlags == 0);
g_dwWsockInitFlags = 0;
}
//**********************************************************************