134 lines
2.5 KiB
C++
134 lines
2.5 KiB
C++
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1996 Microsoft Corporation
|
|||
|
|
|||
|
Module Name :
|
|||
|
|
|||
|
cachep.cxx
|
|||
|
|
|||
|
Abstract:
|
|||
|
This module contains the internal tsunami caching routines
|
|||
|
|
|||
|
Author:
|
|||
|
Murali R. Krishnan ( MuraliK ) 16-Jan-1995
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "TsunamiP.Hxx"
|
|||
|
#pragma hdrstop
|
|||
|
|
|||
|
// specifies how many characters we will use for hashing string names
|
|||
|
# define g_dwFastHashLength (16)
|
|||
|
|
|||
|
HASH_TYPE
|
|||
|
CalculateHashAndLengthOfPathName(
|
|||
|
LPCSTR pszPathName,
|
|||
|
PULONG pcbLength
|
|||
|
)
|
|||
|
{
|
|||
|
HASH_TYPE hash = 0;
|
|||
|
CHAR ch;
|
|||
|
|
|||
|
DWORD start;
|
|||
|
DWORD index;
|
|||
|
|
|||
|
ASSERT( pszPathName != NULL );
|
|||
|
ASSERT( pcbLength != NULL );
|
|||
|
|
|||
|
*pcbLength = strlen(pszPathName);
|
|||
|
|
|||
|
//
|
|||
|
// hash the last g_dwFastHashLength characters
|
|||
|
//
|
|||
|
|
|||
|
if ( *pcbLength < g_dwFastHashLength ) {
|
|||
|
start = 0;
|
|||
|
} else {
|
|||
|
start = *pcbLength - g_dwFastHashLength;
|
|||
|
}
|
|||
|
|
|||
|
for ( index = start; pszPathName[index] != '\0'; index++ ) {
|
|||
|
|
|||
|
//
|
|||
|
// This is an extremely slimey way of getting upper case.
|
|||
|
// Kids, don't try this at home
|
|||
|
// -johnson
|
|||
|
//
|
|||
|
|
|||
|
ch = pszPathName[index] & (CHAR)~0x20;
|
|||
|
|
|||
|
hash <<= 1;
|
|||
|
hash ^= ch;
|
|||
|
hash <<= 1;
|
|||
|
hash += ch;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Multiply by length. Murali said so.
|
|||
|
//
|
|||
|
|
|||
|
return( hash * *pcbLength);
|
|||
|
|
|||
|
} // CalculateHashAndLengthOfPathName
|
|||
|
|
|||
|
|
|||
|
|
|||
|
BOOL
|
|||
|
DeCache(
|
|||
|
PCACHE_OBJECT pCacheObject,
|
|||
|
BOOL fLockCacheTable
|
|||
|
)
|
|||
|
/*++
|
|||
|
Description:
|
|||
|
|
|||
|
This function removes this cache object from any list it may be on.
|
|||
|
|
|||
|
The cache table lock must be taken if fLockCacheTable is FALSE.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
pCacheObject - Object to decache
|
|||
|
fLockCacheTable - FALSE if the cache table lock has already been taken
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
ASSERT( pCacheObject->Signature == CACHE_OBJ_SIGNATURE );
|
|||
|
TSUNAMI_TRACE( TRACE_CACHE_DECACHE, pCacheObject );
|
|||
|
|
|||
|
//
|
|||
|
// Already decached if not on any cache lists
|
|||
|
//
|
|||
|
|
|||
|
if ( !RemoveCacheObjFromLists( pCacheObject, fLockCacheTable ) )
|
|||
|
{
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// This undoes the initial reference. The last person to check in this
|
|||
|
// cache object will cause it to be deleted after this point.
|
|||
|
//
|
|||
|
|
|||
|
TsDereferenceCacheObj( pCacheObject, fLockCacheTable );
|
|||
|
|
|||
|
return( TRUE );
|
|||
|
}
|
|||
|
|
|||
|
BOOL
|
|||
|
TsDeCacheCachedBlob(
|
|||
|
PVOID pBlobPayload
|
|||
|
)
|
|||
|
/*++
|
|||
|
Description:
|
|||
|
|
|||
|
This function removes a blob payload object from the cache
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
pCacheObject - Object to decache
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return DeCache( (((PBLOB_HEADER)pBlobPayload)-1)->pCache, TRUE );
|
|||
|
}
|