Windows2003-3790/inetcore/outlookexpress/msoert/memcache.h
2020-09-30 16:53:55 +02:00

107 lines
4.7 KiB
C++

// --------------------------------------------------------------------------------
// MemCache.h
// Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
// --------------------------------------------------------------------------------
#ifndef __MEMCACHE_H
#define __MEMCACHE_H
// --------------------------------------------------------------------------------
// Forward Decls
// --------------------------------------------------------------------------------
class CMemoryCache;
typedef CMemoryCache *LPMEMORYCACHE;
// --------------------------------------------------------------------------------
// CACHECELLS
// --------------------------------------------------------------------------------
#define CACHECELLS 20480
// --------------------------------------------------------------------------------
// MEMCACHECELL
// --------------------------------------------------------------------------------
typedef struct tagMEMCACHECELL {
#ifdef DEBUG
ULONG cFree;
ULONG cAlloc;
#endif
LPVOID pvItemHead; // Pointer to first block
} MEMCACHECELL, *LPMEMCACHECELL;
// --------------------------------------------------------------------------------
// Memory Cache Debug Metrics
// --------------------------------------------------------------------------------
#ifdef DEBUG
typedef struct tagMEMCACHEMETRIC {
ULONG cAlloc;
ULONG cAllocCache;
ULONG cbAlloc;
ULONG cbAllocCache;
ULONG cFree;
ULONG cbFree;
ULONG cbCacheMax;
ULONG cFreeFull;
ULONG cLookAhead;
ULONG cMostAlloc;
ULONG cMostFree;
ULONG cbMostAlloc;
ULONG cbMostFree;
} MEMCACHEMETRIC, *LPMEMCACHEMETRIC;
#define INCMETRIC(_member, _amount) (m_rMetric.##_member += _amount)
#else // DEBUG
#define INCMETRIC(_member, _amount) 1 ? (void)0 : (void)
#endif // DEBUG
// --------------------------------------------------------------------------------
// MEMCACHEITEM
// --------------------------------------------------------------------------------
typedef struct tagMEMCACHEITEM {
LPVOID pvItemNext; // Pointer to next block of same size
} MEMCACHEITEM, *LPMEMCACHEITEM;
// --------------------------------------------------------------------------------
// CMemoryCache
// --------------------------------------------------------------------------------
class CMemoryCache : public IMalloc
{
public:
// ----------------------------------------------------------------------------
// Construction
// ----------------------------------------------------------------------------
CMemoryCache(IMalloc *pMalloc, ULONG cbMin=0, ULONG cbCacheMax=131072);
~CMemoryCache(void);
// ----------------------------------------------------------------------------
// IUnknown Members
// ----------------------------------------------------------------------------
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv) { return TrapError(E_NOTIMPL); }
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
// ----------------------------------------------------------------------------
// CMemoryCache Members
// ----------------------------------------------------------------------------
STDMETHODIMP_(LPVOID) Alloc(ULONG cb);
STDMETHODIMP_(LPVOID) Realloc(LPVOID pv, ULONG cb);
STDMETHODIMP_(VOID) Free(LPVOID pv);
STDMETHODIMP_(VOID) HeapMinimize(void);
STDMETHODIMP_(INT) DidAlloc(LPVOID pv) { return(m_pMalloc->DidAlloc(pv)); }
STDMETHODIMP_(ULONG) GetSize(LPVOID pv) { return(m_pMalloc->GetSize(pv)); }
private:
// ----------------------------------------------------------------------------
// Private Data
// ----------------------------------------------------------------------------
ULONG m_cRef; // Reference Count
ULONG m_cbMin; // Smallest size buffer to cache
ULONG m_cbCacheMax; // Maximum size of the cache
ULONG m_cbCacheCur; // Current Size of the cache
IMalloc *m_pMalloc; // Memory Allocator
MEMCACHECELL m_rgCell[CACHECELLS]; // Array of pointers to cell chains
CRITICAL_SECTION m_cs; // Critical Section
#ifdef DEBUG
MEMCACHEMETRIC m_rMetric; // Debug Stats on Cache Usage
#endif
};
#endif // __MEMCACHE_H