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.
 
 
 
 
 
 

260 lines
5.3 KiB

/**********************************************************************/
/** Microsoft Windows NT **/
/** Copyright(c) Microsoft Corp., 1998 **/
/**********************************************************************/
/*
filecach.hxx
This module declares the private interface to the file cache
FILE HISTORY:
MCourage 11-Dec-1997 Created
*/
#ifndef _FILECACH_H_
#define _FILECACH_H_
extern HANDLE g_hFileCacheShutdownEvent;
extern BOOL g_fFileCacheShutdown;
/*
* Symbolic Constants
*/
#define FCF_UNINITIALIZED 0x00000001
#define FCF_FOR_IO 0x00000002
#define FCF_NO_DEREF 0x00000004
#define TS_ERROR_SUCCESS 0
#define TS_ERROR_OUT_OF_MEMORY 1
#define TS_ERROR_ALREADY_CACHED 2
const DWORD c_dwSleepmax = 1000; // on file opens don't sleep longer than 1s
const DWORD c_SleepTimeout = 100; // Don't sleep more than 100 times
/*
* File Cache functions
*/
BOOL
FileCache_Initialize(
IN DWORD dwMaxFiles
);
VOID
FileCache_Terminate(
VOID
);
DWORD
CacheFile(
IN TS_OPEN_FILE_INFO * pOpenFile,
IN DWORD dwFlags
);
VOID
NotifyInitializedFile(
IN TS_OPEN_FILE_INFO * pOpenFile
);
VOID
DecacheFile(
IN TS_OPEN_FILE_INFO * pOpenFile,
IN DWORD dwFlags
);
VOID
FlushFileCache(
VOID
);
typedef BOOL (*PFCFILTERRTN)(TS_OPEN_FILE_INFO *pOpenFile, PVOID pv);
VOID
FilteredFlushFileCache(
IN PFCFILTERRTN pFilterRoutine,
IN PVOID pv
);
BOOL
CheckoutFile(
IN LPCSTR pstrPath,
IN DWORD dwFlags,
OUT TS_OPEN_FILE_INFO ** ppOpenFile
);
BOOL
CheckoutFileEntry(
IN TS_OPEN_FILE_INFO * pOpenFile,
IN DWORD dwFlags
);
VOID
CheckinFile(
IN TS_OPEN_FILE_INFO * pOpenFile,
IN DWORD dwFlags
);
/*
* Statistics stuff
*/
class CFileCacheStats
{
private:
DWORD FilesCached; // # of files currently in the cache
DWORD TotalFilesCached; // # of files added to the cache ever
DWORD Hits; // cache hits
DWORD Misses; // cache misses
DWORD Flushes; // flushes due to dir change or other
DWORD OplockBreaks; // decache operations due to oplock breaks
DWORD OplockBreaksToNone; // decache operations due to oplock Break To None
DWORD FlushedEntries; // # of flushed entries still kicking around
DWORD TotalFlushed; // # of entries ever flushed from the cache
DWORD Decached4Space; // # of entries decached to make room
public:
CFileCacheStats()
: FilesCached(0),
TotalFilesCached(0),
Hits(0),
Misses(0),
Flushes(0),
OplockBreaks(0),
OplockBreaksToNone(0),
FlushedEntries(0),
TotalFlushed(0),
Decached4Space(0)
{}
BOOL DumpToHtml(CHAR * pchBuffer, LPDWORD lpcbBuffer) const;
BOOL QueryStats(INETA_CACHE_STATISTICS * pCacheCtrs) const;
DWORD GetFilesCached() const
{
return FilesCached;
}
DWORD GetTotalFilesCached() const
{
return TotalFilesCached;
}
DWORD GetHits() const
{
return Hits;
}
DWORD GetMisses() const
{
return Misses;
}
DWORD GetFlushes() const
{
return Flushes;
}
DWORD GetOplockBreaks() const
{
return OplockBreaks;
}
DWORD GetOplockBreaksToNone() const
{
return OplockBreaksToNone;
}
DWORD GetFlushedEntries() const
{
return FlushedEntries;
}
DWORD GetTotalFlushed() const
{
return TotalFlushed;
}
DWORD GetDecached4Space() const
{
return Decached4Space;
}
VOID IncFilesCached(VOID)
{
InterlockedIncrement((LONG *)&FilesCached);
InterlockedIncrement((LONG *)&TotalFilesCached);
}
VOID DecFilesCached(VOID)
{
InterlockedDecrement((LONG *)&FilesCached);
}
VOID IncHits(VOID)
{
InterlockedIncrement((LONG *)&Hits);
}
VOID IncMisses(VOID)
{
InterlockedIncrement((LONG *)&Misses);
}
VOID IncFlushes(VOID)
{
InterlockedIncrement((LONG *)&Flushes);
}
VOID IncOplockBreaks(VOID)
{
InterlockedIncrement((LONG *)&OplockBreaks);
}
VOID IncOplockBreaksToNone(VOID)
{
InterlockedIncrement((LONG *)&OplockBreaksToNone);
}
VOID IncFlushedEntries(VOID)
{
InterlockedIncrement((LONG *)&FlushedEntries);
InterlockedIncrement((LONG *)&TotalFlushed);
}
VOID IncDecached4Space(VOID)
{
InterlockedIncrement((LONG *)&Decached4Space);
}
VOID DecFlushedEntries(VOID)
{
InterlockedDecrement((LONG *)&FlushedEntries);
//
// If we're shutting down, and all the entries are
// gone, it's safe to clean up.
//
if ((FlushedEntries == 0)
&& g_fFileCacheShutdown
&& (FilesCached == 0)) {
SetEvent(g_hFileCacheShutdownEvent);
}
}
};
class TS_FILE_FLUSH_STATE
{
public:
LIST_ENTRY ListHead;
PFCFILTERRTN pfnFilter;
PVOID pvParm;
};
#if DBG
BOOL CheckFileState(TS_OPEN_FILE_INFO *pOpenFile);
#endif
#define CHECK_FILE_STATE( x ) DBG_ASSERT( CheckFileState((x)) )
#endif