]> git.saurik.com Git - wxWidgets.git/commitdiff
added wxDebugContext::SetShutdownNotifyFunction() (patch 1887210)
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 9 Feb 2008 23:57:41 +0000 (23:57 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 9 Feb 2008 23:57:41 +0000 (23:57 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51624 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/latex/wx/debugcxt.tex
include/wx/memory.h
src/common/memory.cpp

index ae38e3e81557ae94d76c7b92ac53de908a6c2c61..4967c04bdd2b63bf3451389b5084b17a8ac28c85 100644 (file)
@@ -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}
index def1b7345835ba788a06b87f2471de6712e725b4..3291e38eb6f6f9694d99f284b141168362a5293e 100644 (file)
@@ -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;
index ae3b6383b52620a8538455ec86648aa873f0e7bd..4f593c3de1b5fe89c1112a4714e3a3349898acb0 100644 (file)
@@ -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)