X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/12028905135250524409f1e7b9bfa9c55e5ce16b..d6d6a882d4d8ea0d7ef706a45fa92b96f34c94c7:/include/wx/memory.h diff --git a/include/wx/memory.h b/include/wx/memory.h index 6b1bed37cd..3b58cb55d9 100644 --- a/include/wx/memory.h +++ b/include/wx/memory.h @@ -18,6 +18,7 @@ #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__