183 lines
5.8 KiB
C
183 lines
5.8 KiB
C
|
/* 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_
|