X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f172cb8200f08ba1c6735a0d507991c877c0d68f..8f4745feeb2850f3bebb3af45407e164550d541a:/src/common/memory.cpp?ds=sidebyside diff --git a/src/common/memory.cpp b/src/common/memory.cpp index ae3b6383b5..c55af4d9bc 100644 --- a/src/common/memory.cpp +++ b/src/common/memory.cpp @@ -16,7 +16,7 @@ #pragma hdrstop #endif -#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT +#if wxUSE_MEMORY_TRACING || wxUSE_DEBUG_CONTEXT #include "wx/memory.h" @@ -46,7 +46,7 @@ #include #include -#if wxUSE_THREADS && defined(__WXDEBUG__) +#if wxUSE_THREADS #define USE_THREADSAFE_MEMORY_ALLOCATION 1 #else #define USE_THREADSAFE_MEMORY_ALLOCATION 0 @@ -370,7 +370,7 @@ void wxMemStruct::Dump () msg2.Printf(wxT(" at 0x%lX, size %d"), (long)GetActualData(), (int)RequestSize()); msg += msg2; - wxDebugContext::OutputDumpLine(msg); + wxDebugContext::OutputDumpLine(msg.c_str()); } else { @@ -381,7 +381,7 @@ void wxMemStruct::Dump () wxString msg2; msg2.Printf(wxT("non-object data at 0x%lX, size %d"), (long)GetActualData(), (int)RequestSize() ); msg += msg2; - wxDebugContext::OutputDumpLine(msg); + wxDebugContext::OutputDumpLine(msg.c_str()); } } @@ -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) { } @@ -572,26 +575,21 @@ void wxDebugContext::TraverseList (PmSFV func, wxMemStruct *from) */ bool wxDebugContext::PrintList (void) { -#ifdef __WXDEBUG__ - TraverseList ((PmSFV)&wxMemStruct::PrintNode, (checkPoint ? checkPoint->m_next : (wxMemStruct*)NULL)); + TraverseList ((PmSFV)&wxMemStruct::PrintNode, (checkPoint ? checkPoint->m_next : NULL)); return true; -#else - return false; -#endif } bool wxDebugContext::Dump(void) { -#ifdef __WXDEBUG__ { - wxChar* appName = (wxChar*) wxT("application"); + const wxChar* appName = wxT("application"); wxString appNameStr; if (wxTheApp) { appNameStr = wxTheApp->GetAppName(); - appName = WXSTRINGCAST appNameStr; - OutputDumpLine(wxT("----- Memory dump of %s at %s -----"), appName, WXSTRINGCAST wxNow() ); + appName = appNameStr.c_str(); + OutputDumpLine(wxT("----- Memory dump of %s at %s -----"), appName, static_cast(wxNow().c_str())); } else { @@ -599,18 +597,14 @@ bool wxDebugContext::Dump(void) } } - TraverseList ((PmSFV)&wxMemStruct::Dump, (checkPoint ? checkPoint->m_next : (wxMemStruct*)NULL)); + TraverseList ((PmSFV)&wxMemStruct::Dump, (checkPoint ? checkPoint->m_next : NULL)); OutputDumpLine(wxEmptyString); OutputDumpLine(wxEmptyString); return true; -#else - return false; -#endif } -#ifdef __WXDEBUG__ struct wxDebugStatsStruct { long instanceCount; @@ -635,19 +629,17 @@ static wxDebugStatsStruct *InsertStatsStruct(wxDebugStatsStruct *head, wxDebugSt st->next = head; return st; } -#endif bool wxDebugContext::PrintStatistics(bool detailed) { -#ifdef __WXDEBUG__ { - wxChar* appName = (wxChar*) wxT("application"); + const wxChar* appName = wxT("application"); wxString appNameStr; if (wxTheApp) { appNameStr = wxTheApp->GetAppName(); - appName = WXSTRINGCAST appNameStr; - OutputDumpLine(wxT("----- Memory statistics of %s at %s -----"), appName, WXSTRINGCAST wxNow() ); + appName = appNameStr.c_str(); + OutputDumpLine(wxT("----- Memory statistics of %s at %s -----"), appName, static_cast(wxNow().c_str())); } else { @@ -664,7 +656,7 @@ bool wxDebugContext::PrintStatistics(bool detailed) wxDebugStatsStruct *list = NULL; - wxMemStruct *from = (checkPoint ? checkPoint->m_next : (wxMemStruct*)NULL ); + wxMemStruct *from = (checkPoint ? checkPoint->m_next : NULL ); if (!from) from = wxDebugContext::GetHead (); @@ -726,21 +718,17 @@ bool wxDebugContext::PrintStatistics(bool detailed) OutputDumpLine(wxEmptyString); return true; -#else - (void)detailed; - return false; -#endif } bool wxDebugContext::PrintClasses(void) { { - wxChar* appName = (wxChar*) wxT("application"); + const wxChar* appName = wxT("application"); wxString appNameStr; if (wxTheApp) { appNameStr = wxTheApp->GetAppName(); - appName = WXSTRINGCAST appNameStr; + appName = appNameStr.c_str(); wxLogMessage(wxT("----- Classes in %s -----"), appName); } } @@ -797,7 +785,7 @@ int wxDebugContext::Check(bool checkAll) { int nFailures = 0; - wxMemStruct *from = (checkPoint ? checkPoint->m_next : (wxMemStruct*)NULL ); + wxMemStruct *from = (checkPoint ? checkPoint->m_next : NULL ); if (!from || checkAll) from = wxDebugContext::GetHead (); @@ -858,6 +846,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; @@ -894,7 +887,6 @@ static MemoryCriticalSection memLocker; #endif // USE_THREADSAFE_MEMORY_ALLOCATION -#ifdef __WXDEBUG__ #if !(defined(__WXMSW__) && (defined(WXUSINGDLL) || defined(WXMAKINGDLL_BASE))) #if wxUSE_GLOBAL_MEMORY_OPERATORS void * operator new (size_t size, wxChar * fileName, int lineNum) @@ -1041,8 +1033,6 @@ void wxDebugFree(void * buf, bool WXUNUSED(isVect) ) free((char *)st); } -#endif // __WXDEBUG__ - // Trace: send output to the current debugging stream void wxTrace(const wxChar * ...) { @@ -1129,6 +1119,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) @@ -1143,4 +1149,4 @@ void wxDebugContextDumpDelayCounter::DoDump() // least one cleanup counter object static wxDebugContextDumpDelayCounter wxDebugContextDumpDelayCounter_One; -#endif // (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT +#endif // wxUSE_MEMORY_TRACING || wxUSE_DEBUG_CONTEXT