Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

198 lines
4.3 KiB

/*++
Copyright (c) 1998-2001 Microsoft Corporation
Module Name:
hashp.h
Abstract:
The private definition of response cache hash table.
Author:
Alex Chen (alexch) 28-Mar-2001
Revision History:
--*/
#ifndef _HASHP_H_
#define _HASHP_H_
#include "hash.h"
#ifdef __cplusplus
extern "C" {
#endif
// Global Variables
extern ULONG g_UlHashTableBits;
extern ULONG g_UlHashTableSize;
extern ULONG g_UlHashTableMask;
extern ULONG g_UlHashIndexShift;
extern ULONG g_UlNumOfHashUriKeys;
// If we're using PagedPool for the hashtable, we must not access the
// hashtable at dispatch level. The ((void) 0) is because PAGED_CODE()
// expands to nothing in a free build and otherwise you get a compiler
// warning.
#define HASH_PAGED_CODE(pHashTable) \
do { \
if ((pHashTable)->PoolType == PagedPool) { \
PAGED_CODE(); \
((void) 0); /* for free build */ \
} \
} while (0)
#undef HASH_TEST
//
// Hash Table Bucket Stored UriKey definitions
//
#define INVALID_SLOT_INDEX ((LONG) (-1))
typedef struct _HASH_URIKEY
{
PUL_URI_CACHE_ENTRY pUriCacheEntry;
ULONG Hash; // Hash signature
} HASHURIKEY, *PHASHURIKEY;
//
// Hash Table Bucket definitions
//
typedef struct _HASH_BUCKET
{
RWSPINLOCK RWSpinLock;
PUL_URI_CACHE_ENTRY pUriCacheEntry;
ULONG_PTR Entries; // force alignment
// followed immediately by HASHURIKEY HashUriKey[g_UlNumOfHashUriKeys];
} HASHBUCKET, *PHASHBUCKET;
/***************************************************************************++
Routine Description:
Get the indexed bucket
Return Value:
--***************************************************************************/
__inline
PHASHBUCKET
UlpHashTableIndexedBucket(
IN PHASHTABLE pHashTable,
IN ULONG Index
)
{
ASSERT(Index < g_UlHashTableSize);
ASSERT(NULL != pHashTable->pBuckets);
PHASHBUCKET pBucket = (PHASHBUCKET) (((PBYTE) pHashTable->pBuckets)
+ (Index << g_UlHashIndexShift));
ASSERT((PBYTE) pBucket
< (PBYTE) pHashTable->pBuckets + pHashTable->NumberOfBytes);
return pBucket;
} // UlpHashTableIndexedBucket
/***************************************************************************++
Routine Description:
Retrieve the bucket associated with a URI_KEY
Return Value:
--***************************************************************************/
__inline
PHASHBUCKET
UlpHashTableBucketFromUriKey(
IN PHASHTABLE pHashTable,
IN PURI_KEY pUriKey
)
{
ASSERT(NULL != pUriKey);
ASSERT(HASH_INVALID_SIGNATURE != pUriKey->Hash);
return UlpHashTableIndexedBucket(
pHashTable,
pUriKey->Hash & g_UlHashTableMask
);
} // UlpHashTableBucketFromUriKey
/***************************************************************************++
Routine Description:
Get the address of the inline array of HASHURIKEYs at the end of
the HASHBUCKET
Return Value:
--***************************************************************************/
__inline
PHASHURIKEY
UlpHashTableUriKeyFromBucket(
IN PHASHBUCKET pBucket
)
{
return (PHASHURIKEY) ((PBYTE) pBucket + sizeof(HASHBUCKET));
}
/***************************************************************************++
Routine Description:
Compare two URI_KEYS that have identical hashes to see if the
URIs also match (case-insensitively).
(Hashes must have been computed with HashStringNoCaseW or
HashCharNoCaseW.)
Return Value:
--***************************************************************************/
__inline
BOOLEAN
UlpEqualUriKeys(
IN PURI_KEY pUriKey1,
IN PURI_KEY pUriKey2
)
{
ASSERT(pUriKey1->Hash == pUriKey2->Hash);
return (pUriKey1->Length == pUriKey2->Length
&& UlEqualUnicodeString(
pUriKey1->pUri,
pUriKey2->pUri,
pUriKey1->Length,
TRUE
)
);
}
#ifdef __cplusplus
}; // extern "C"
#endif
#endif // _HASHP_H_