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.
 
 
 
 
 
 

225 lines
4.6 KiB

//=================================================================
//
// ResourceManager.h
//
// Copyright (c) 1999-2001 Microsoft Corporation, All Rights Reserved
//
//=================================================================
#ifndef __RESOURCEMANAGER_H__
#define __RESOURCEMANAGER_H__
#include <windows.h>
#include <list>
#include <BrodCast.h>
#include <fwcommon.h>
#include <assertbreak.h>
#include <ccriticalsec.h>
#include <helper.h>
#define DUPLICATE_RELEASE FALSE
class CResourceManager ;
class CResourceList ;
class CResource ;
class CRule ;
class CBinaryRule ;
class CAndRule ;
class COrRule ;
typedef CResource* (*PFN_RESOURCE_INSTANCE_CREATOR) ( PVOID pData ) ;
class CResourceList
{
friend class CResourceManager ;
protected:
CResource* GetResource ( LPVOID pData ) ;
ULONG ReleaseResource ( CResource* pResource ) ;
void ShutDown () ;
protected:
typedef std::list<CResource*> tagInstances ;
tagInstances m_Instances ;
PFN_RESOURCE_INSTANCE_CREATOR m_pfnInstanceCreator ;
GUID guidResourceId ;
CCriticalSec m_csList ;
public:
CResourceList () ;
~CResourceList () ;
void RemoveFromList ( CResource* pResource ) ;
BOOL LockList(){ m_csList.Enter(); return TRUE; };
BOOL UnLockList(){ m_csList.Leave(); return TRUE; };
public:
BOOL m_bShutDown ;
} ;
class CResourceListAutoLock
{
CResourceList* resourcelist ;
BOOL bLocked ;
public:
CResourceListAutoLock ( CResourceList* list ) :
resourcelist ( list ),
bLocked ( FALSE )
{
if ( resourcelist )
{
bLocked = resourcelist->LockList () ;
}
}
~CResourceListAutoLock ()
{
if ( bLocked )
{
resourcelist->UnLockList () ;
}
}
};
class CResourceManager
{
protected:
std::list < CResourceList* > m_Resources ;
CStaticCritSec m_csResourceManager ;
public:
CResourceManager () ;
~CResourceManager () ;
CResource* GetResource ( GUID ResourceId, LPVOID pData ) ;
ULONG ReleaseResource ( GUID ResourceId, CResource* pResource ) ;
BOOL AddInstanceCreator ( GUID ResourceId, PFN_RESOURCE_INSTANCE_CREATOR pfnResourceInstanceCreator ) ;
void CResourceManager :: ForcibleCleanUp () ;
static CResourceManager sm_TheResourceManager ;
};
typedef OnDeleteObj2< GUID, CResource* ,
CResourceManager,
ULONG (CResourceManager:: *)(GUID, CResource*),
&CResourceManager::ReleaseResource > CRelResource;
class CResource
{
protected:
CRule *m_pRules ;
CResourceList *m_pResources ; //pointer to container
LONG m_lRef ;
protected:
virtual BOOL OnAcquire () { return TRUE ; } ;
virtual BOOL OnRelease () { return TRUE ; } ;
virtual BOOL OnInitialAcquire () { return TRUE ; } ;
virtual BOOL OnFinalRelease() { return TRUE ; } ;
BOOL m_bValid;
DWORD m_dwCreationError;
public:
CResource () ;
virtual ~CResource () ;
virtual void RuleEvaluated ( const CRule *a_RuleEvaluated ) = 0;
BOOL Acquire () ;
ULONG Release () ;
void SetParent ( CResourceList *pList ) { m_pResources = pList ; }
virtual BOOL IsOneOfMe ( LPVOID pData ) { return TRUE ; }
virtual BOOL IsValid ( ) { return m_bValid; }
virtual DWORD GetCreationError ( ) { return m_dwCreationError; }
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Rules
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class CRule
{
protected:
CResource* m_pResource ;
LONG m_lRef ;
public:
CRule ( CResource* pResource ) : m_pResource ( pResource ), m_lRef ( 0 ) {}
virtual ~CRule () {} ;
virtual ULONG AddRef ()
{
return ( InterlockedIncrement ( &m_lRef ) ) ;
}
virtual ULONG Release ()
{
LONG lCount ;
lCount = InterlockedDecrement ( &m_lRef );
try
{
if (IsVerboseLoggingEnabled())
{
LogMessage2(L"CRule::Release, count is (approx) %d", m_lRef);
}
}
catch ( ... )
{
}
if ( lCount == 0 )
{
try
{
LogMessage(L"CRule Ref Count = 0");
}
catch ( ... )
{
}
delete this;
}
else if (lCount > 0x80000000)
{
ASSERT_BREAK(DUPLICATE_RELEASE);
LogErrorMessage(L"Duplicate CRule Release()");
}
return lCount ;
}
virtual void Detach ()
{
if ( m_pResource )
{
m_pResource = NULL ;
}
}
//Checkrule returns true if rule is satisfied
virtual BOOL CheckRule () { return FALSE ; }
} ;
#endif //__RESOURCEMANAGER_H__