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.
 
 
 
 
 
 

153 lines
3.4 KiB

//+----------------------------------------------------------------------------
//
// Copyright (C) 2001, Microsoft Corporation
//
// File: DfsSiteNameSupport.hxx
//
// Contents: implements repository for SiteName to DfsSite mappings.
//
//
// History: November, 2001. SupW
//
//-----------------------------------------------------------------------------
#ifndef __DFS_SITE_NAME_SUP__
#define __DFS_SITE_NAME_SUP__
#include <shash.h>
class DfsSite;
typedef struct _DFS_SITENAME_DATA
{
SHASH_HEADER Header;
UNICODE_STRING SiteName; // hash key.
ULONG FirstAccessTime;
DfsSite *pDfsSite; // DfsSite corresonding to the above SiteName.
} DFS_SITE_NAME_DATA, *PDFS_SITE_NAME_DATA;
//
// Default number of hash buckets that the sitename->DfsSite cache
// uses. The assumption is that the average will have no more than 64 sites.
//
#define DFS_DEFAULT_SITE_NAME_SUP_BUCKETS 64
//
// This cache is a repository of DfsSite instances,
// indexed by their site names.
//
class DfsSiteNameSupport
{
protected:
PSHASH_TABLE _pSiteNameTable;
DfsSiteNameSupport()
{
_pSiteNameTable = NULL;
}
virtual DFSSTATUS
Initialize( ULONG NumBuckets = DFS_DEFAULT_SITE_NAME_SUP_BUCKETS );
public:
~ DfsSiteNameSupport( VOID )
{
if (_pSiteNameTable != NULL)
{
//
// Shash should provide a more efficient way of doing this.
//
InvalidateCache();
ShashTerminateHashTable( _pSiteNameTable );
_pSiteNameTable = NULL;
}
}
static DfsSiteNameSupport *
CreateSiteNameSupport(
DFSSTATUS * pStatus,
ULONG HashBuckets = DFS_DEFAULT_SITE_NAME_SUP_BUCKETS);
virtual DFSSTATUS
StoreSiteInCache(
DfsSite *pSite);
virtual PSHASH_HEADER
LookupIpInHash(
PUNICODE_STRING pSiteName);
DFSSTATUS
RemoveSiteFromCache(
PUNICODE_STRING pSiteName);
ULONG
NumElements()
{
ULONG Elems = 0;
if (_pSiteNameTable != NULL)
{
Elems = _pSiteNameTable->TotalItems;
}
return Elems;
}
VOID
InvalidateCache(VOID);
DFSSTATUS
CreateSiteNameData(
IN DfsSite *pNewSite,
OUT PDFS_SITE_NAME_DATA *ppSiteData);
void
ReleaseSiteNameData(PDFS_SITE_NAME_DATA pData);
static VOID
DfsDeallocateSiteNameData(PVOID pPointer);
DfsSite *
StartSiteEnumerate( SHASH_ITERATOR *pIter )
{
PDFS_SITE_NAME_DATA pData = NULL;
pData = (PDFS_SITE_NAME_DATA)SHashStartEnumerate( pIter, _pSiteNameTable );
if (pData == NULL)
{
return NULL;
}
return pData->pDfsSite;
}
DfsSite *
NextSiteEnumerate( SHASH_ITERATOR *pIter )
{
PDFS_SITE_NAME_DATA pData = NULL;
pData = (PDFS_SITE_NAME_DATA)SHashNextEnumerate( pIter, _pSiteNameTable );
if (pData == NULL)
{
return NULL;
}
return pData->pDfsSite;
}
VOID
FinishSiteEnumerate( SHASH_ITERATOR *pIter )
{
SHashFinishEnumerate( pIter, _pSiteNameTable);
}
VOID
InvalidateAgedSites( VOID );
};
#endif // __DFS_SITE_NAME_SUP_