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.
137 lines
3.4 KiB
137 lines
3.4 KiB
//
|
|
// memcache.h
|
|
//
|
|
|
|
#ifndef MEMCACHE_H
|
|
#define MEMCACHE_H
|
|
|
|
#include "mem.h"
|
|
#include "globals.h"
|
|
|
|
extern LONG g_lMemCacheMutex;
|
|
|
|
typedef struct _MEMCACHE
|
|
{
|
|
ULONG uMaxPtrs;
|
|
ULONG iNextFree;
|
|
void *rgPtrs[1]; // 1 or more...
|
|
} MEMCACHE;
|
|
|
|
MEMCACHE *MemCache_New(ULONG uMaxPtrs);
|
|
|
|
void MemCache_Delete(MEMCACHE *pMemCache);
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// MemCache_Add
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
inline BOOL MemCache_Add(MEMCACHE *pMemCache, void *pv)
|
|
{
|
|
BOOL fRet = FALSE;
|
|
|
|
if (InterlockedIncrement(&g_lMemCacheMutex) != 0)
|
|
goto Exit;
|
|
|
|
if (pMemCache->iNextFree >= pMemCache->uMaxPtrs)
|
|
goto Exit; // cache is full!
|
|
|
|
pMemCache->rgPtrs[pMemCache->iNextFree++] = pv;
|
|
|
|
fRet = TRUE;
|
|
|
|
Exit:
|
|
InterlockedDecrement(&g_lMemCacheMutex);
|
|
return fRet;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// MemCache_Remove
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
inline void *MemCache_Remove(MEMCACHE *pMemCache)
|
|
{
|
|
void *pv = NULL;
|
|
|
|
if (InterlockedIncrement(&g_lMemCacheMutex) != 0)
|
|
goto Exit;
|
|
|
|
if (pMemCache->iNextFree == 0)
|
|
goto Exit;
|
|
|
|
pv = pMemCache->rgPtrs[--pMemCache->iNextFree];
|
|
|
|
Exit:
|
|
InterlockedDecrement(&g_lMemCacheMutex);
|
|
return pv;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// MemCache_NewOp
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#ifdef DEBUG
|
|
inline void *MemCache_NewOp(MEMCACHE *pMemCache, size_t nSize, const TCHAR *pszFile, int iLine)
|
|
#else
|
|
inline void *MemCache_NewOp(MEMCACHE *pMemCache, size_t nSize)
|
|
#endif
|
|
{
|
|
void *pv = NULL;
|
|
|
|
if (pMemCache != NULL)
|
|
{
|
|
if (pv = MemCache_Remove(pMemCache))
|
|
{ // Issue: update debug mem track info
|
|
memset(pv, 0, nSize);
|
|
}
|
|
}
|
|
|
|
if (pv == NULL)
|
|
{
|
|
#ifdef DEBUG
|
|
pv = Dbg_MemAllocClear(nSize, pszFile, iLine);
|
|
#else
|
|
pv = cicMemAllocClear(nSize);
|
|
#endif
|
|
}
|
|
|
|
return pv;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// MemCache_DeleteOp
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
inline void MemCache_DeleteOp(MEMCACHE *pMemCache, void *pv)
|
|
{
|
|
if (pMemCache == NULL ||
|
|
!MemCache_Add(pMemCache, pv))
|
|
{
|
|
cicMemFree(pv);
|
|
}
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
#define DECLARE_CACHED_NEW \
|
|
void *operator new(size_t nSize, const TCHAR *pszFile, int iLine) { return MemCache_NewOp(_s_pMemCache, nSize, pszFile, iLine); } \
|
|
void operator delete(void *pv) { MemCache_DeleteOp(_s_pMemCache, pv); } \
|
|
static _MEMCACHE *_s_pMemCache;
|
|
|
|
#else // !DEBUG
|
|
#define DECLARE_CACHED_NEW \
|
|
void *operator new(size_t nSize) { return MemCache_NewOp(_s_pMemCache, nSize); } \
|
|
void operator delete(void *pv) { MemCache_DeleteOp(_s_pMemCache, pv); } \
|
|
static _MEMCACHE *_s_pMemCache;
|
|
#endif
|
|
|
|
#define DECLARE_CACHED_NEW_STATIC(the_class) \
|
|
MEMCACHE *the_class::_s_pMemCache = NULL;
|
|
|
|
#endif // MEMCACHE_H
|