From: Vadim Zeitlin Date: Sat, 9 Feb 2008 23:57:41 +0000 (+0000) Subject: added wxDebugContext::SetShutdownNotifyFunction() (patch 1887210) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/6dfbea27b9d581dbb6c033e2b336d6035f5e4fc8 added wxDebugContext::SetShutdownNotifyFunction() (patch 1887210) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51624 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/latex/wx/debugcxt.tex b/docs/latex/wx/debugcxt.tex index ae38e3e815..4967c04bdd 100644 --- a/docs/latex/wx/debugcxt.tex +++ b/docs/latex/wx/debugcxt.tex @@ -217,6 +217,15 @@ This is obsolete, replaced by \helpref{wxLog}{wxlog} functionality. \helpref{wxDebugContext::GetLevel}{wxdebugcontextgetlevel} +\membersection{wxDebugContext::SetShutdownNotifyFunction}\label{wxdebugcontextsetshutdownnotifyhook} + +\func{void}{SetShutdownNotifyFunction}{\param{wxShutdownNotifyFunction }{func}} + +Installs a function to be called at the end of wxWidgets shutdown. It will be called after +all files with global instances of wxDebugContextDumpDelayCounter have run their destructors. + +The shutdown function must be take no parameters and return nothing. + \membersection{wxDebugContext::SetStandardError}\label{wxdebugcontextsetstandarderror} \func{bool}{SetStandardError}{\void} diff --git a/include/wx/memory.h b/include/wx/memory.h index def1b73458..3291e38eb6 100644 --- a/include/wx/memory.h +++ b/include/wx/memory.h @@ -207,6 +207,9 @@ public: typedef void (wxMemStruct::*PmSFV) (); +// Type of the app function that can be installed and called at wxWidgets shutdown +// (after all other registered files with global destructors have been closed down). +typedef void (*wxShutdownNotifyFunction)(); /* Debugging class. This will only have a single instance, but it's @@ -307,6 +310,8 @@ public: // This function is used to output the dump static void OutputDumpLine(const wxChar *szFormat, ...); + static void SetShutdownNotifyFunction(wxShutdownNotifyFunction shutdownFn); + private: // Store these here to allow access to the list without // needing to have a wxMemStruct object. @@ -316,23 +321,25 @@ private: // Set to false if we're not checking all previous nodes when // we do a new. Set to true when we are. static bool m_checkPrevious; + + // Holds a pointer to an optional application function to call at shutdown. + static wxShutdownNotifyFunction sm_shutdownFn; + + // Have to access our shutdown hook + friend class wxDebugContextDumpDelayCounter; }; // 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(); - } + wxDebugContextDumpDelayCounter(); + ~wxDebugContextDumpDelayCounter(); + private: void DoDump(); static int sm_count; diff --git a/src/common/memory.cpp b/src/common/memory.cpp index ae3b6383b5..4f593c3de1 100644 --- a/src/common/memory.cpp +++ b/src/common/memory.cpp @@ -452,6 +452,9 @@ static wxMarkerType markerCalc[2]; int wxDebugContext::m_balign = (int)((char *)&markerCalc[1] - (char*)&markerCalc[0]); int wxDebugContext::m_balignmask = (int)((char *)&markerCalc[1] - (char*)&markerCalc[0]) - 1; +// Pointer to global function to call at shutdown +wxShutdownNotifyFunction wxDebugContext::sm_shutdownFn; + wxDebugContext::wxDebugContext(void) { } @@ -858,6 +861,11 @@ void wxDebugContext::OutputDumpLine(const wxChar *szFormat, ...) dbgout.Printf(buf); } +void wxDebugContext::SetShutdownNotifyFunction(wxShutdownNotifyFunction shutdownFn) +{ + sm_shutdownFn = shutdownFn; +} + #if USE_THREADSAFE_MEMORY_ALLOCATION static bool memSectionOk = false; @@ -1129,6 +1137,22 @@ void wxTraceLevel(int, const wxChar * ...) // All global variables are initialized to 0 at the very beginning, and this is just fine. int wxDebugContextDumpDelayCounter::sm_count; +wxDebugContextDumpDelayCounter::wxDebugContextDumpDelayCounter() +{ + sm_count++; +} + +wxDebugContextDumpDelayCounter::~wxDebugContextDumpDelayCounter() +{ + if ( !--sm_count ) + { + // Notify app if we've been asked to do that + if( wxDebugContext::sm_shutdownFn ) + wxDebugContext::sm_shutdownFn(); + DoDump(); + } +} + void wxDebugContextDumpDelayCounter::DoDump() { if (wxDebugContext::CountObjectsLeft(true) > 0)