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.
|
|
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name :
rhash.h
Abstract:
This file contains type definitions hash table support
Author:
Revision History:
Nimish Khanolkar (NimishK) May-98
--*/
#ifndef _RHASH_H_
#define _RHASH_H_
#include <windows.h>
#include <limits.h>
#define RETRY_TABLE_SIGNATURE_VALID 'RtsV'
#define RETRY_TABLE_SIGNATURE_FREE 'RtsF'
class RETRYQ;
typedef struct HASH_BUCKET_ENTRY { DWORD m_NumEntries; LONG m_RefNum; LIST_ENTRY m_ListHead; CShareLockNH m_Lock;
HASH_BUCKET_ENTRY (void) { InitializeListHead(&m_ListHead); m_NumEntries = 0; m_RefNum = 0; }
}BUCKET_ENTRY, *PBUCKET_ENTRY;
#define BITS_IN_int (sizeof(int) * CHAR_BIT)
#define THREE_QUARTERS ((int) ((BITS_IN_int * 3) / 4))
#define ONE_EIGHTH ((int) (BITS_IN_int / 8))
#define HIGH_BITS (~((unsigned int)(~0) >> ONE_EIGHTH))
#define TABLE_SIZE 241
/////////////////////////////////////////////////////////////////////////////////
// CRETRY_HASH_TABLE:
//
// A hash table to store all the domains that are in the Retry queue.
// The hash key is the name of the domain
//
/////////////////////////////////////////////////////////////////////////////////
class CRETRY_HASH_TABLE { protected: DWORD m_Signature; LONG m_TotalEntries; HASH_BUCKET_ENTRY m_HashTable[TABLE_SIZE]; RETRYQ* m_pRetryQueue;
public:
CRETRY_HASH_TABLE(); ~CRETRY_HASH_TABLE(); HRESULT DeInitialize(void); void RemoveAllEntries(void); void RemoveThisEntry(CRETRY_HASH_ENTRY * pHashEntry, DWORD BucketNum);
BOOL RemoveFromTable(const char * SearchData, CRETRY_HASH_ENTRY* *ppExistingEntry); BOOL InsertIntoTable (CRETRY_HASH_ENTRY * pHashEntry); BOOL IsTableEmpty(void) const {return (m_TotalEntries == 0);} BOOL IsHashTableValid(void){ return (m_Signature == RETRY_TABLE_SIGNATURE_VALID);}
RETRYQ* GetQueuePtr(){return m_pRetryQueue;}
//An adaptation of Peter Weinberger's (PJW) generic
//hashing algorithm based on Allen Holub's version.
//Code from Practical Algorithms for Programmers
//by Andrew Binstock
unsigned int HashFunction (const char * String) { unsigned int HashValue = 0; unsigned int i = 0;
_ASSERT(String != NULL);
for (HashValue = 0; String && *String; ++String) { HashValue = (HashValue << ONE_EIGHTH) + * String; if((i = HashValue & HIGH_BITS) != 0) { HashValue = (HashValue ^ (i >> THREE_QUARTERS)) & ~ HIGH_BITS; } }
HashValue %= TABLE_SIZE; return HashValue; }
private: //Unused functions
#if 0
DWORD PrimaryCompareFunction(const char * SearchData, CRETRY_HASH_ENTRY * pExistingEntry) { DWORD Result = 0; Result = lstrcmpi(SearchData, pExistingEntry->GetHashKey()); return Result; } CRETRY_HASH_ENTRY * FindHashData(const char * SearchData);
LIST_ENTRY & GetBucketHead(DWORD BucketNum) { return m_HashTable[BucketNum].m_ListHead; } #endif
public: //debug function
void PrintAllEntries(void); };
#endif
|