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
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;
|
|
}
|
|
//**********************************************************************
|