/**********************************************************************/
/**                       Microsoft Windows NT                       **/
/**                Copyright(c) Microsoft Corp., 1998                **/
/**********************************************************************/

/*
    tlcach.h

    This module declares the private interface to the two level cache

    FILE HISTORY:
        BAlam           10-31-98        Initial Revision
*/

#ifndef _TLCACH_H_
#define _TLCACH_H_

//
// Default interval between adjusting the memory cache max size
//

#define DEFAULT_ADJUSTMENT_TIME         60000

DWORD
InitializeTwoLevelCache( 
    IN DWORDLONG                cbMemoryCacheSize
);

DWORD
ReadFileIntoMemoryCache( 
    IN HANDLE                   hFile,
    IN DWORD                    cbFile,
    OUT DWORD *                 pcbRequired,
    OUT VOID **                 ppvBuffer
);

DWORD
ReleaseFromMemoryCache(
    IN VOID *                   pvBuffer,
    IN DWORD                    cbBuffer
);

DWORD
TerminateTwoLevelCache(
    VOID
);

DWORD
DumpMemoryCacheToHtml(
    IN CHAR *                   pszBuffer,
    IN OUT DWORD *              pcbBuffer
);

VOID
QueryMemoryCacheStatistics(
    IN INETA_CACHE_STATISTICS * pCacheCtrs,
    IN BOOL                     fClearAll
);


#if defined(LOOKASIDE)

class CLookAside
{
public:
    CLookAside(
        ALLOC_CACHE_CONFIGURATION* paacc,
        SIZE_T                     caacc);
    ~CLookAside();

    LPVOID
    Alloc(
        IN DWORD cbSize);

    BOOL
    Free(
        IN LPVOID pv,
        IN DWORD cbSize);

protected:
    enum {
        HEAP_PREFIX = 8,
        HEAP_SUFFIX = 0,
        ACACHE_OVERHEAD = sizeof(DWORD),
        SIGNATURE   = 'ALsT',
        SIGNATURE_X = 'XLsT',
    };

    int
    _FindAllocator(
        IN DWORD cbSize);

    DWORD                       m_dwSignature;
    ALLOC_CACHE_HANDLER**       m_apach;    // array of acaches
    ALLOC_CACHE_CONFIGURATION*  m_aacc;     // parallel array of config data
    SIZE_T                      m_cach;     // number of acaches
    SIZE_T                      m_nMinSize;
    SIZE_T                      m_nMaxSize;
};

#endif // LOOKASIDE

#endif