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.
 
 
 
 
 
 

151 lines
3.0 KiB

#ifndef _DATASETCACHE_HXX_
#define _DATASETCACHE_HXX_
class DATA_SET_CACHE_ENTRY
{
public:
DATA_SET_CACHE_ENTRY()
{
}
virtual ~DATA_SET_CACHE_ENTRY()
{
}
HRESULT
Create(
WCHAR * pszSubPath,
DWORD dwMatchDataSetNumber,
DWORD dwPrefixDataSetNumber
);
BOOL
QueryDoesMatch(
STRU & strPath,
DWORD * pdwDataSetNumber
)
{
if ( pdwDataSetNumber == NULL )
{
DBG_ASSERT( FALSE );
return FALSE;
}
*pdwDataSetNumber = 0;
if ( strPath.QueryCCH() < _strSubPath.QueryCCH() )
{
return FALSE;
}
if ( memcmp( strPath.QueryStr(),
_strSubPath.QueryStr(),
_strSubPath.QueryCB() ) == 0 )
{
if ( strPath.QueryCCH() == _strSubPath.QueryCCH() )
{
*pdwDataSetNumber = _dwMatchDataSetNumber;
}
else
{
*pdwDataSetNumber = _dwPrefixDataSetNumber;
}
return TRUE;
}
return FALSE;
}
private:
STRU _strSubPath;
DWORD _dwMatchDataSetNumber;
DWORD _dwPrefixDataSetNumber;
};
class DATA_SET_CACHE
{
public:
DATA_SET_CACHE()
: _cRefs( 1 ),
_cEntries( 0 ),
_bufEntries( _abEntries, sizeof( _abEntries ) )
{
}
virtual ~DATA_SET_CACHE()
{
DATA_SET_CACHE_ENTRY * pDataSetCacheEntry;
for (DWORD i = 0; i < _cEntries; i++ )
{
pDataSetCacheEntry = QueryEntries()[ i ];
DBG_ASSERT( pDataSetCacheEntry != NULL );
delete pDataSetCacheEntry;
}
}
static
HRESULT
Initialize(
VOID
);
static
VOID
Terminate(
VOID
)
{
}
HRESULT
Create(
STRU & strSiteRoot
);
HRESULT
GetDataSetNumber(
STRU & strMetabasePath,
DWORD * pdwDataSetNumber
);
VOID
ReferenceDataSetCache(
VOID
)
{
InterlockedIncrement( &_cRefs );
}
VOID
DereferenceDataSetCache(
VOID
)
{
if ( InterlockedDecrement( &_cRefs ) == 0 )
{
delete this;
}
}
private:
DATA_SET_CACHE_ENTRY **
QueryEntries(
VOID
)
{
return (DATA_SET_CACHE_ENTRY**) _bufEntries.QueryPtr();
}
LONG _cRefs;
STRU _strSiteRoot;
DWORD _cEntries;
BUFFER _bufEntries;
BYTE _abEntries[ 64 ];
static DWORD sm_cMaxCacheEntries;
};
#endif