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.
|
|
/*++
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_
|