\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}
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
// 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.
// 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;
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)
{
}
dbgout.Printf(buf);
}
+void wxDebugContext::SetShutdownNotifyFunction(wxShutdownNotifyFunction shutdownFn)
+{
+ sm_shutdownFn = shutdownFn;
+}
+
#if USE_THREADSAFE_MEMORY_ALLOCATION
static bool memSectionOk = false;
// 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)