added wxDebugContext::SetShutdownNotifyFunction() (patch 1887210)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51624 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-02-09 23:57:41 +00:00
parent 01c0355483
commit 6dfbea27b9
3 changed files with 47 additions and 7 deletions

View 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}

View 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();
~wxDebugContextDumpDelayCounter();
~wxDebugContextDumpDelayCounter() {
sm_count--;
if(!sm_count) DoDump();
}
private:
void DoDump();
static int sm_count;

View 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)