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.
177 lines
6.1 KiB
177 lines
6.1 KiB
/* (C) 1997-1998 Microsoft Corp.
|
|
*
|
|
* file: ch.h
|
|
*
|
|
* description: Main CH header.
|
|
*/
|
|
|
|
#ifndef _H_CH
|
|
#define _H_CH
|
|
|
|
|
|
/*
|
|
* Defines
|
|
*/
|
|
|
|
#define CH_EVT_ENTRYREMOVED 0
|
|
#define CH_EVT_QUERYREMOVEENTRY 1
|
|
|
|
#define CH_KEY_UNCACHABLE ((unsigned)-1)
|
|
|
|
// Used in debug build to determine display frequency of cache search stats.
|
|
#define CH_STAT_DISPLAY_FREQ 64
|
|
|
|
// Max number of caches that can be created at once.
|
|
#define CH_MAX_NUM_CACHES 20
|
|
|
|
|
|
|
|
/*
|
|
* Typedefs
|
|
*/
|
|
|
|
typedef void *CHCACHEHANDLE;
|
|
typedef CHCACHEHANDLE *PCHCACHEHANDLE;
|
|
|
|
typedef BOOLEAN (__fastcall *CHCACHECALLBACK)(
|
|
CHCACHEHANDLE hCache,
|
|
unsigned Event,
|
|
unsigned iCacheEntry,
|
|
void *UserDefined);
|
|
|
|
// Node in a CH cache.
|
|
typedef struct
|
|
{
|
|
LIST_ENTRY HashList;
|
|
UINT32 Key1, Key2; // 64-bit hash value broken in two.
|
|
LIST_ENTRY MRUList;
|
|
void *UserDefined; // Associated data, used by SBC for fast-path.
|
|
CHCACHEHANDLE hCache; // Used by SBC fast-path to get to the cache.
|
|
} CHNODE, *PCHNODE;
|
|
|
|
|
|
// Primary data structure containing the cache info and the hash bucket array.
|
|
// CHNODEs are allocated at end of bucket array.
|
|
typedef struct
|
|
{
|
|
unsigned bNotifyRemoveLRU : 1;
|
|
unsigned bQueryRemoveLRU : 1;
|
|
UINT32 HashKeyMask;
|
|
CHCACHECALLBACK pfnCacheCallback;
|
|
void *pContext;
|
|
CHNODE *NodeArray;
|
|
unsigned NumEntries;
|
|
|
|
LIST_ENTRY MRUList;
|
|
LIST_ENTRY FreeList;
|
|
|
|
#ifdef DC_DEBUG
|
|
// Statistics gathered in debug builds.
|
|
unsigned MaxEntries;
|
|
unsigned NumSearches;
|
|
unsigned DeepestSearch;
|
|
unsigned NumHits;
|
|
unsigned TotalDepthOnHit;
|
|
unsigned SearchHitDepthHistogram[8];
|
|
unsigned TotalDepthOnMiss;
|
|
unsigned SearchMissDepthHistogram[8];
|
|
#endif
|
|
|
|
LIST_ENTRY HashBuckets[1];
|
|
} CHCACHEDATA, *PCHCACHEDATA;
|
|
|
|
|
|
/*
|
|
* Inlines.
|
|
*/
|
|
|
|
|
|
/****************************************************************************/
|
|
// Given a pointer to a CHNODE, returns the containing hCache.
|
|
/****************************************************************************/
|
|
//__inline CHCACHEHANDLE RDPCALL CH_GetCacheHandleFromNode(CHNODE *pNode)
|
|
#define CH_GetCacheHandleFromNode(_pNode) ((_pNode)->hCache)
|
|
|
|
|
|
/****************************************************************************/
|
|
// Given a cache handle, returns the stored pContext information passed
|
|
// into CH_CreateCache().
|
|
/****************************************************************************/
|
|
//__inline void * RDPCALL CH_GetCacheContextFromHandle(CHCACHEHANDLE hCache)
|
|
#define CH_GetCacheContext(_hCache) \
|
|
(((PCHCACHEDATA)(_hCache))->pContext)
|
|
|
|
|
|
/****************************************************************************/
|
|
// Given a cache handle, sets the stored pContext information passed into
|
|
// CH_CreateCache().
|
|
/****************************************************************************/
|
|
//__inline void * RDPCALL CH_GetCacheContextFromHandle(CHCACHEHANDLE hCache)
|
|
#define CH_SetCacheContext(_hCache, _pContext) \
|
|
(((PCHCACHEDATA)(_hCache))->pContext) = (_pContext)
|
|
|
|
|
|
/****************************************************************************/
|
|
// Given a pointer to a CHNODE, returns the node's index.
|
|
/****************************************************************************/
|
|
//__inline unsigned RDPCALL CH_GetCacheIndexFromNode(CHNODE *pNode)
|
|
#define CH_GetCacheIndexFromNode(_pNode) \
|
|
((unsigned)((_pNode) - ((PCHCACHEDATA)((_pNode)->hCache))->NodeArray))
|
|
|
|
|
|
/****************************************************************************/
|
|
// Given a cache handle and an index, returns a pointer to the node.
|
|
/****************************************************************************/
|
|
//__inline PCHNODE RDPCALL CH_GetNodeFromCacheIndex(
|
|
// CHCACHEHANDLE hCache,
|
|
// unsigned CacheIndex)
|
|
#define CH_GetNodeFromCacheIndex(_hCache, _CacheIndex) \
|
|
(&(((PCHCACHEDATA)(_hCache))->NodeArray[_CacheIndex]))
|
|
|
|
|
|
/****************************************************************************/
|
|
// Given a cache handle and an index, changes the node's UserDefined value.
|
|
/****************************************************************************/
|
|
//__inline void RDPCALL CH_SetUserDefined(
|
|
// CHCACHEHANDLE hCache,
|
|
// unsigned CacheIndex,
|
|
// void *UserDefined)
|
|
#define CH_SetUserDefined(_hCache, _CacheIndex, _UserDefined) \
|
|
(((PCHCACHEDATA)(_hCache))->NodeArray[_CacheIndex].UserDefined = \
|
|
_UserDefined)
|
|
|
|
|
|
/****************************************************************************/
|
|
// Given a cache handle and an index, returns the node's UserDefined value.
|
|
/****************************************************************************/
|
|
//__inline void * RDPCALL CH_GetUserDefined(
|
|
// CHCACHEHANDLE hCache,
|
|
// unsigned CacheIndex)
|
|
#define CH_GetUserDefined(_hCache, _CacheIndex) \
|
|
(((PCHCACHEDATA)(_hCache))->NodeArray[_CacheIndex].UserDefined)
|
|
|
|
|
|
/****************************************************************************/
|
|
// Given a node, changes its UserDefined value.
|
|
/****************************************************************************/
|
|
//__inline void RDPCALL CH_SetNodeUserDefined(CHNODE *pNode, void *UserDefined)
|
|
#define CH_SetNodeUserDefined(_pNode, _UserDefined) \
|
|
((_pNode)->UserDefined = (_UserDefined))
|
|
|
|
|
|
/****************************************************************************/
|
|
// Given a node, returns its UserDefined value.
|
|
/****************************************************************************/
|
|
//__inline void * RDPCALL CH_GetNodeUserDefined(CHNODE *pNode)
|
|
#define CH_GetNodeUserDefined(_pNode) ((_pNode)->UserDefined)
|
|
|
|
|
|
/****************************************************************************/
|
|
// Returns the number of cached entries in a cache.
|
|
/****************************************************************************/
|
|
//__inline unsigned RDPCALL CH_GetNumEntries(CHCACHEHANDLE hCache)
|
|
#define CH_GetNumEntries(_hCache) (((PCHCACHEDATA)(_hCache))->NumEntries)
|
|
|
|
|
|
#endif // !defined(_H_CH)
|
|
|