|
|
/* Copyright 1996 Microsoft */
#ifndef _DBGMEMORY_
#define _DBGMEMORY_
#ifdef DEBUG
#define DBGMEM_MEMORY 0x00
#define DBGMEM_STRDUP 0x01
#define DBGMEM_OBJECT 0x02
#define DBGMEM_TRACED 0x04
#define DBGMEM_UNKNOBJ 0x08
#endif // DEBUG
#define DML_TYPE_MAIN 0
#define DML_TYPE_THREAD 1
#define DML_TYPE_FRAME 2
#define DML_TYPE_DOWNLOAD 3
#define DML_TYPE_NAVIGATE 4
#define DML_TYPE_MASK 0x0000000f
#define DML_BEGIN 0x00000000
#define DML_END 0x80000000
#ifdef DEBUG
EXTERN_C BOOL g_bUseNewLeakDetection;
STDAPI_(void) MemLeakInit(UINT wFlags, LPCTSTR pszFile, UINT iLine); #define DebugMemLeak(wFlags) MemLeakInit(wFlags, TEXT(__FILE__), __LINE__)
// shdocvw memory leak tracker...
// void _DumpMemLeak( DWORD dwFlags ); // call DebugMemLeak instead!
// stuff used to move memory ownership from one thread to another
STDAPI_(void) remove_from_thread_memlist( DWORD dwThreadId, LPVOID pv ); STDAPI_(void) transfer_to_thread_memlist( DWORD dwThread, LPVOID pv ); STDAPI_(UINT) mem_thread_message( void ); STDAPI_(void) received_for_thread_memlist( DWORD dwFlags, void * pData ); #else
#define DebugMemLeak(wFlags) (0)
#endif
typedef struct _leakmeminfo { HMODULE hmod; // which dll was it allocated from...
void* pv; UINT cb; UINT nType; // DWORD adwCaller[4]; // for future
LPCSTR pszFile; // file where memory block was allocced
INT_PTR iLine; // line where memory block was allocced
} LEAKMEMINFO, *PLEAKMEMINFO;
typedef struct _IntelliLeakDumpCBFunctions { void (STDMETHODCALLTYPE *pfnDumpLeakedMemory)(PLEAKMEMINFO pmeminfo); LPWSTR (STDMETHODCALLTYPE *pfnGetLeakSymbolicName)(PLEAKMEMINFO pmeminfo, LPWSTR pwszBuf, int cchBuf); } INTELLILEAKDUMPCBFUNCTIONS;
typedef struct _LeakDetectFunctions {
HLOCAL (STDMETHODCALLTYPE * pfnTrcLocalAlloc)(UINT uFlags, UINT uBytes, LPCSTR pszFile, const int iLine );
HLOCAL (STDMETHODCALLTYPE * pfnTrcLocalFree )(HLOCAL hMem );
LPTSTR (STDMETHODCALLTYPE * pfnTrcStrDup )(LPTSTR lpSrch, LPCSTR pszFile, const int iLine);
void (STDMETHODCALLTYPE * pfnDumpMemLeak )(DWORD wFlags); void (STDMETHODCALLTYPE * pfnDebugMemLeak)(UINT wFlags, LPCTSTR pszFile, UINT iLine); void (STDMETHODCALLTYPE * pfnreceived_for_thread_memlist)( DWORD dwFlags, void * pData ); void (STDMETHODCALLTYPE * pfnremove_from_thread_memlist )( DWORD dwThreadId, LPVOID pv ); UINT (STDMETHODCALLTYPE * pfnmem_thread_message )(); void (STDMETHODCALLTYPE * pfnremove_from_memlist )(void *pv); void (STDMETHODCALLTYPE * pfnadd_to_memlist )(HMODULE hmod, void *pv, unsigned int nSize, UINT nType, LPCSTR pszFile, const INT_PTR iLine ); void (STDMETHODCALLTYPE * pfnregister_hmod_intelli_dump)(HMODULE hmod, const INTELLILEAKDUMPCBFUNCTIONS*pildf);
} LEAKDETECTFUNCS;
#ifdef __cplusplus
extern "C" { /* Assume C declarations for C++ */ #endif
STDAPI_(BOOL) GetLeakDetectionFunctionTable(LEAKDETECTFUNCS *pTable); #ifdef __cplusplus
}
#endif /* __cplusplus */
#ifdef DEBUG
// use the macros below
STDAPI_(HLOCAL) _TrcLocalAlloc( UINT uFlags, // flags used in LocalAlloc
UINT uBytes, // number of bytes to be allocated
LPCSTR pszFile, // file which allocced memory
const int iLine // line which allocced memory
);
STDAPI_(LPTSTR) _TrcStrDup( LPTSTR lpSrch, // pointer to string to StrDup
LPCSTR pszFile, // file which allocced memory
const int iLine // line which allocced memory
);
STDAPI_(HLOCAL) _TrcLocalFree( HLOCAL hMem // memory to be freed
);
STDAPI_(void) add_to_memlist( HMODULE hmod, // for secondary memory allocators...
void *pv, // pointer to memory block
unsigned int nSize, // size of memory block
unsigned int nType, // what the possible use of the memory is
LPCSTR pszFile, // file name
const INT_PTR iLine // line number
);
STDAPI_(void) remove_from_memlist( void *pv // pointer to memory block
);
STDAPI_(void) register_intelli_dump( HMODULE hmod, const INTELLILEAKDUMPCBFUNCTIONS *pfns );
#ifndef _NO_DBGMEMORY_REDEFINITION_
#ifdef __cplusplus
extern void* __cdecl operator new( size_t nSize, LPCSTR pszFile, const int iLine ); #define new new( __FILE__, __LINE__ )
#endif
#endif // _NO_DBGMEMORY_REDEFINITIONS
// use these macros
#define TrcLocalAlloc( _uFlags, _uBytes ) \
_TrcLocalAlloc( _uFlags, _uBytes, __FILE__, __LINE__ )
#define TrcStrDup( _pSrc ) \
_TrcStrDup( (LPTSTR)_pSrc, (LPCSTR)__FILE__, (const int)__LINE__ )
#define TrcLocalFree( _hMem ) \
_TrcLocalFree( _hMem )
#define DbgAddToMemList( _pv ) \
{ \ if ( _pv ) \ add_to_memlist( 0, _pv, (UINT)LocalSize( _pv ), DBGMEM_TRACED, __FILE__, __LINE__ ); \ }
#define DbgRemoveFromMemList( _pv ) \
remove_from_memlist( _pv )
#else // DEBUG
#define add_to_memlist(p) (0)
#define remove_from_memlist(p) (0)
#define remove_from_thread_memlist(p,v) (0)
#define TrcLocalAlloc( _uFlags, _uBytes ) \
LocalAlloc( _uFlags, _uBytes )
#define TrcStrDup( _pSrc ) \
StrDup( _pSrc )
#define TrcLocalFree( _hMem ) \
LocalFree( _hMem )
#define DbgAddToMemList( _pv ) // NOP
#define DbgRemoveFromMemList( _pv ) // NOP
#endif // DEBUG
#endif // _DBGMEMORY_
|