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.
 
 
 
 
 
 

175 lines
2.9 KiB

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name :
uldisconnect.cxx
Abstract:
UL_DISCONNECT_CONTEXT implementation
Author:
Bilal Alam (balam) 15-Feb-2000
Environment:
Win32 - User Mode
Project:
W3DT.DLL
--*/
#include "precomp.hxx"
extern PFN_ULATQ_DISCONNECT g_pfnDisconnect;
//
// UL_DISCONNECT_CONTEXT statics
//
LONG UL_DISCONNECT_CONTEXT::sm_cOutstanding;
ALLOC_CACHE_HANDLER * UL_DISCONNECT_CONTEXT::sm_pachDisconnects;
VOID
UL_DISCONNECT_CONTEXT::DoWork(
DWORD,
DWORD,
LPOVERLAPPED
)
/*++
Routine Description:
Handles async calls to UlWaitForDisconnect
Arguments:
All arguments unused
Return Value:
None
--*/
{
DBG_ASSERT( CheckSignature() );
//
// Our handling is simple. We just call the disconnection completion
// routine with the context passed thru UlAtqWaitForDisconnect
//
DBG_ASSERT( g_pfnDisconnect != NULL );
g_pfnDisconnect( _pvContext );
//
// We're done with the context, delete it now
//
DereferenceUlDisconnectContext();
}
//static
VOID
UL_DISCONNECT_CONTEXT::WaitForOutstandingDisconnects(
VOID
)
/*++
Routine Description:
Wait for the outstanding UL_DISCONNECT_CONTEXTs to drain. This will
happen when we close the AppPool handle to begin shutdown
Arguments:
None
Return Value:
None
--*/
{
while ( sm_cOutstanding != 0 )
{
DBGPRINTF(( DBG_CONTEXT,
"Waiting for %d disconnect contexts to drain\n",
sm_cOutstanding ));
Sleep( 1000 );
}
}
//static
HRESULT
UL_DISCONNECT_CONTEXT::Initialize(
VOID
)
/*++
Routine Description:
Initialize disconnect globals
Arguments:
None
Return Value:
HRESULT
--*/
{
ALLOC_CACHE_CONFIGURATION acConfig;
//
// Setup allocation lookaside
//
acConfig.nConcurrency = 1;
acConfig.nThreshold = 100;
acConfig.cbSize = sizeof( UL_DISCONNECT_CONTEXT );
DBG_ASSERT( sm_pachDisconnects == NULL );
sm_pachDisconnects = new ALLOC_CACHE_HANDLER( "UL_DISCONNECT_CONTEXT",
&acConfig );
if ( sm_pachDisconnects == NULL )
{
return HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY );
}
return NO_ERROR;
}
//static
VOID
UL_DISCONNECT_CONTEXT::Terminate(
VOID
)
/*++
Routine Description:
Cleanup disconnect globals
Arguments:
None
Return Value:
None
--*/
{
if ( sm_pachDisconnects != NULL )
{
delete sm_pachDisconnects;
sm_pachDisconnects = NULL;
}
}