74 lines
1.7 KiB
C
74 lines
1.7 KiB
C
|
/*****************************************************************************
|
||
|
*
|
||
|
* mem.h
|
||
|
*
|
||
|
*****************************************************************************/
|
||
|
|
||
|
/*****************************************************************************
|
||
|
*
|
||
|
* Arenas
|
||
|
*
|
||
|
* Memory is allocated in chunks called arenas. Arenas contain extra
|
||
|
* bookkeeping in DEBUG to help catch common memory problems like
|
||
|
* overruns and memory leaks. (It doesn't catch dangling pointers,
|
||
|
* though.)
|
||
|
*
|
||
|
*****************************************************************************/
|
||
|
|
||
|
typedef unsigned TM; /* Artificial time */
|
||
|
|
||
|
typedef struct ARENA AR, *PAR;
|
||
|
|
||
|
struct ARENA {
|
||
|
#ifdef DEBUG
|
||
|
PAR parNext; /* Next arena */
|
||
|
PAR parPrev; /* Previous arena */
|
||
|
CB cb; /* Size of rgb */
|
||
|
TM tm; /* Timestamp used to track memory leaks */
|
||
|
#endif
|
||
|
BYTE rgb[4]; /* The actual data */
|
||
|
};
|
||
|
|
||
|
typedef CONST AR *PCAR;
|
||
|
|
||
|
#define parPv(pv) pvSubPvCb(pv, offsetof(AR, rgb))
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
extern TM g_tmNow;
|
||
|
extern AR g_arHead;
|
||
|
#define parHead (&g_arHead)
|
||
|
#endif
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
void STDCALL AssertPar(PCAR par);
|
||
|
#else
|
||
|
#define AssertPar(par)
|
||
|
#endif
|
||
|
void STDCALL FreePv(PVOID pv);
|
||
|
PVOID STDCALL pvAllocCb(CB cb);
|
||
|
PVOID STDCALL pvReallocPvCb(PVOID pv, CB cb);
|
||
|
|
||
|
INLINE PTCH STDCALL
|
||
|
ptchAllocCtch(CTCH ctch)
|
||
|
{
|
||
|
return pvAllocCb(cbCtch(ctch));
|
||
|
}
|
||
|
|
||
|
INLINE PTCH STDCALL
|
||
|
ptchReallocPtchCtch(PTCH ptch, CTCH ctch)
|
||
|
{
|
||
|
return pvReallocPvCb(ptch, cbCtch(ctch));
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************
|
||
|
*
|
||
|
* Garbage collection
|
||
|
*
|
||
|
*****************************************************************************/
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
void STDCALL Gc(void);
|
||
|
#else
|
||
|
#define Gc()
|
||
|
#endif
|