/*
 * memmgr.h - Memory manager module description.
 */


/* Macros
 *********/

#ifdef DEBUG
#define AllocateMemory(size, ppv)         DebugAllocateMemory(size, ppv, #size, __FILE__, __LINE__)
#define ReallocateMemory(pv, size, ppv)   DebugReallocateMemory(pv, size, ppv)
#define FreeMemory(pv)                    DebugFreeMemory(pv)
#define MemorySize(pv)                    DebugMemorySize(pv)
#else
#define AllocateMemory(size, ppv)         IAllocateMemory(size, ppv)
#define ReallocateMemory(pv, size, ppv)   IReallocateMemory(pv, size, ppv)
#define FreeMemory(pv)                    IFreeMemory(pv)
#define MemorySize(pv)                    IMemorySize(pv)
#endif   /* DEBUG */


/* Types
 ********/

#ifdef DEBUG

/* SpewHeapSummary() flags */

typedef enum _spewheapsummaryflags
{
   /* Spew description of each remaining used element. */

   SHS_FL_SPEW_USED_INFO   = 0x0001,

   /* flag combinations */

   ALL_SHS_FLAGS           = SHS_FL_SPEW_USED_INFO
}
SPEWHEAPSUMMARYFLAGS;

#endif   /* DEBUG */


/* Prototypes
 *************/

/* memmgr.c */

extern BOOL InitMemoryManagerModule(void);
extern void ExitMemoryManagerModule(void);
extern COMPARISONRESULT MyMemComp(PCVOID, PCVOID, DWORD);

#ifdef DEBUG

extern BOOL DebugAllocateMemory(DWORD, PVOID *, PCSTR, PCSTR, ULONG);
extern void DebugFreeMemory(PVOID);
extern BOOL DebugReallocateMemory(PVOID, DWORD, PVOID *);
extern DWORD DebugMemorySize(PVOID);
extern BOOL SetMemoryManagerModuleIniSwitches(void);
extern void SpewHeapSummary(DWORD);

#endif


/* Inline Functions
 *******************/

#ifdef IEXPLORER_DOESNT_CHECK_HEAP_RETURN_VALUES

extern BOOL IReallocateMemory(PVOID pvOld, DWORD dwcbNewSize, PVOID *ppvNew);

INLINE BOOL IAllocateMemory(DWORD dwcbSize, PVOID *ppvNew)
{
	return(IReallocateMemory(NULL, dwcbSize, ppvNew));
}

extern BOOL bReserveSpace(void);

#else

INLINE BOOL IAllocateMemory(DWORD dwcbSize, PVOID *ppvNew)
{
   *ppvNew = LocalAlloc(LMEM_FIXED, dwcbSize);
   return(*ppvNew != NULL);
}

INLINE BOOL IReallocateMemory(PVOID pvOld, DWORD dwcbNewSize, PVOID *ppvNew)
{
   *ppvNew = LocalReAlloc(pvOld, dwcbNewSize, LMEM_MOVEABLE);
   return(*ppvNew != NULL);
}

#endif   /* IEXPLORER_DOESNT_CHECK_HEAP_RETURN_VALUES */

INLINE void IFreeMemory(PVOID pv)
{
   EVAL(! LocalFree(pv));

   return;
}

INLINE DWORD IMemorySize(PVOID pv)
{
   return(LocalSize(pv));
}


/* Global Variables
 *******************/

#ifdef DEBUG

/* parameters used by debug version of AllocateMemory() wrapper macros */

extern PCSTR g_pcszElemHdrSize;
extern PCSTR g_pcszElemHdrFile;
extern ULONG g_ulElemHdrLine;

#endif   /* DEBUG */