X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bddd7a8d8953cf4c09e56c13e1bfcc594ba0267e..85f138db83939ce7c59a942aaecca7fa98168db3:/include/wx/memory.h diff --git a/include/wx/memory.h b/include/wx/memory.h index ab82ae3acd..3b58cb55d9 100644 --- a/include/wx/memory.h +++ b/include/wx/memory.h @@ -12,12 +12,13 @@ #ifndef _WX_MEMORYH__ #define _WX_MEMORYH__ -#if defined(__GNUG__) && !defined(__APPLE__) +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma interface "memory.h" #endif #include "wx/defs.h" #include "wx/string.h" +#include "wx/msgout.h" /* The macro which will be expanded to include the file and line number @@ -288,6 +289,9 @@ public: // that are outstanding static int CountObjectsLeft(bool sinceCheckpoint = FALSE); + // This function is used to output the dump + static void OutputDumpLine(const wxChar *szFormat, ...); + private: // Store these here to allow access to the list without // needing to have a wxMemStruct object. @@ -299,6 +303,31 @@ private: static bool m_checkPrevious; }; +// Final cleanup (e.g. deleting the log object and doing memory leak checking) +// will be delayed until all wxDebugContextDumpDelayCounter objects have been +// destructed. Adding one wxDebugContextDumpDelayCounter per file will delay +// memory leak checking until after destructing all global objects. +class WXDLLIMPEXP_BASE wxDebugContextDumpDelayCounter +{ +public: + wxDebugContextDumpDelayCounter() { + sm_count++; + } + + ~wxDebugContextDumpDelayCounter() { + sm_count--; + if(!sm_count) DoDump(); + } +private: + void DoDump(); + static int sm_count; +}; + +// make leak dump after all globals have been destructed +static wxDebugContextDumpDelayCounter wxDebugContextDumpDelayCounter_File; +#define WXDEBUG_DUMPDELAYCOUNTER \ + static wxDebugContextDumpDelayCounter wxDebugContextDumpDelayCounter_Extra; + // Output a debug message, in a system dependent fashion. void WXDLLIMPEXP_BASE wxTrace(const wxChar *fmt ...) ATTRIBUTE_PRINTF_1; void WXDLLIMPEXP_BASE wxTraceLevel(int level, const wxChar *fmt ...) ATTRIBUTE_PRINTF_2; @@ -306,15 +335,24 @@ void WXDLLIMPEXP_BASE wxTraceLevel(int level, const wxChar *fmt ...) ATTRIBUTE_P #define WXTRACE wxTrace #define WXTRACELEVEL wxTraceLevel -#else // else part for the #if __WXDEBUG__ +#else // (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT -inline void wxTrace(const wxChar *WXUNUSED(fmt)) {} -inline void wxTraceLevel(int WXUNUSED(level), const wxChar *WXUNUSED(fmt)) {} +#define WXDEBUG_DUMPDELAYCOUNTER + +// Borland C++ Builder 6 seems to have troubles with inline functions (see bug +// 819700) +#if 0 + inline void wxTrace(const wxChar *WXUNUSED(fmt)) {} + inline void wxTraceLevel(int WXUNUSED(level), const wxChar *WXUNUSED(fmt)) {} +#else + #define wxTrace(fmt) + #define wxTraceLevel(l, fmt) +#endif #define WXTRACE TRUE ? (void)0 : wxTrace #define WXTRACELEVEL TRUE ? (void)0 : wxTraceLevel -#endif // __WXDEBUG__ +#endif // (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT #endif // _WX_MEMORYH__