]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/memory.cpp
no message
[wxWidgets.git] / src / common / memory.cpp
index 0270a1b7f93efed4d3d51db9debe9a3fd7fe5e7b..1d44a664e922b181d95600550817aadcd3e70d06 100644 (file)
@@ -24,7 +24,7 @@
 #include "wx/defs.h"
 #endif
 
-#if (DEBUG && USE_MEMORY_TRACING) || USE_DEBUG_CONTEXT
+#if (WXDEBUG && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
 
 #ifdef __GNUG__
 // #pragma implementation
 
 #include <stdlib.h>
 
-#if USE_IOSTREAMH
+#if wxUSE_IOSTREAMH
 #include <iostream.h>
+#include <fstream.h>
 #else
 #include <iostream>
+#include <fstream>
+#  ifdef _MSC_VER
+      using namespace std;
+#  endif
 #endif
-#include <fstream.h>
 
 #if !defined(__WATCOMC__) && !defined(__VMS__)
 #include <memory.h>
@@ -51,7 +55,7 @@
 #include <stdarg.h>
 #include <string.h>
 
-#ifdef __WINDOWS__
+#ifdef __WXMSW__
 #include <windows.h>
 
 #ifdef GetClassInfo
 
 #include "wx/memory.h"
 
-/*
 #ifdef new
 #undef new
 #endif
-*/
 
 // wxDebugContext wxTheDebugContext;
 /*
@@ -326,7 +328,7 @@ void wxMemStruct::PrintNode ()
   {
     wxObject *obj = (wxObject *)m_actualData;
     wxClassInfo *info = obj->GetClassInfo();
-
+/*
     if (info && info->GetClassName())
       wxTrace("%s", info->GetClassName());
     else
@@ -335,13 +337,25 @@ void wxMemStruct::PrintNode ()
     if (m_fileName)
       wxTrace(" (%s %d)", m_fileName, (int)m_lineNum);
 
+    wxTrace(" at $%lX, size %d\n", (long)GetActualData(), (int)RequestSize());
+*/
+    // Let's put this in standard form so IDEs can load the file at the appropriate
+    // line
+    if (m_fileName)
+      wxTrace("%s(%d): ", m_fileName, (int)m_lineNum);
+
+    if (info && info->GetClassName())
+      wxTrace("%s", info->GetClassName());
+    else
+      wxTrace("object");
+
     wxTrace(" at $%lX, size %d\n", (long)GetActualData(), (int)RequestSize());
   }
   else
   {
-    wxTrace("Non-object data");
     if (m_fileName)
-      wxTrace(" (%s %d)", m_fileName, (int)m_lineNum);
+      wxTrace("%s(%d): ", m_fileName, (int)m_lineNum);
+    wxTrace("non-object data");
     wxTrace(" at $%lX, size %d\n", (long)GetActualData(), (int)RequestSize());
   }
 }
@@ -353,23 +367,19 @@ void wxMemStruct::Dump ()
   if (m_isObject)
   {
     wxObject *obj = (wxObject *)m_actualData;
-//    wxClassInfo *info = obj->GetClassInfo();
 
     if (m_fileName)
-      wxTrace("Item (%s %d)", m_fileName, (int)m_lineNum);
-    else
-      wxTrace("Item");
+      wxTrace("%s(%d): ", m_fileName, (int)m_lineNum);
 
-    wxTrace(" at $%lX, size %d: ", (long)GetActualData(), (int)RequestSize());
-//    wxTrace(info->GetClassName());
     obj->Dump(wxDebugContext::GetStream());
+    wxTrace(" at $%lX, size %d", (long)GetActualData(), (int)RequestSize());
     wxTrace("\n");
   }
   else
   {
-    wxTrace("Non-object data");
     if (m_fileName)
-      wxTrace(" (%s %d)", m_fileName, (int)m_lineNum);
+      wxTrace("%s(%d): ", m_fileName, (int)m_lineNum);
+    wxTrace("non-object data");
     wxTrace(" at $%lX, size %d\n", (long)GetActualData(), (int)RequestSize());
   }
 }
@@ -387,7 +397,9 @@ int wxMemStruct::ValidateNode ()
            ErrorMsg ("Object already deleted");
        else {
            // Can't use the error routines as we have no recognisable object.
-           wxTrace("Can't verify memory struct - all bets are off!\n");
+#ifndef __WXGTK__
+            wxTrace("Can't verify memory struct - all bets are off!\n");
+#endif
        }
        return 0;
     }
@@ -623,11 +635,11 @@ void wxDebugContext::TraverseList (PmSFV func, wxMemStruct *from)
   */
 bool wxDebugContext::PrintList (void)
 {
-#if DEBUG
+#if WXDEBUG
   if (!HasStream())
     return FALSE;
 
-  TraverseList ((PmSFV)&wxMemStruct::PrintNode, (checkPoint ? checkPoint->m_next : NULL));
+  TraverseList ((PmSFV)&wxMemStruct::PrintNode, (checkPoint ? checkPoint->m_next : (wxMemStruct*)NULL));
 
   return TRUE;
 #else
@@ -637,7 +649,7 @@ bool wxDebugContext::PrintList (void)
 
 bool wxDebugContext::Dump(void)
 {
-#if DEBUG
+#if WXDEBUG
   if (!HasStream())
     return FALSE;
 
@@ -649,10 +661,16 @@ bool wxDebugContext::Dump(void)
     {
         appNameStr = wxTheApp->GetAppName();
         appName = (char*) (const char*) appNameStr;
-        wxTrace("Memory dump of %s at %s:\n", appName, wxNow());
+        wxTrace("----- Memory dump of %s at %s -----\n", appName, WXSTRINGCAST wxNow() );
+    }
+    else
+    {
+      wxTrace( "----- Memory dump -----\n" );
     }
   }
-  TraverseList ((PmSFV)&wxMemStruct::Dump, (checkPoint ? checkPoint->m_next : NULL));
+  TraverseList ((PmSFV)&wxMemStruct::Dump, (checkPoint ? checkPoint->m_next : (wxMemStruct*)NULL));
+  
+  wxTrace( "\n\n" );
 
   return TRUE;
 #else
@@ -687,10 +705,26 @@ static wxDebugStatsStruct *InsertStatsStruct(wxDebugStatsStruct *head, wxDebugSt
 
 bool wxDebugContext::PrintStatistics(bool detailed)
 {
-#if DEBUG
+#if WXDEBUG
   if (!HasStream())
     return FALSE;
 
+  if (TRUE)
+  {
+    char* appName = "application";
+    wxString appNameStr("");
+    if (wxTheApp)
+    {
+        appNameStr = wxTheApp->GetAppName();
+        appName = (char*) (const char*) appNameStr;
+        wxTrace("----- Memory statistics of %s at %s -----\n", appName, WXSTRINGCAST wxNow() );
+    }
+    else
+    {
+      wxTrace( "----- Memory statistics -----\n" );
+    }
+  }
+  
   bool currentMode = GetDebugMode();
   SetDebugMode(FALSE);
   
@@ -700,7 +734,7 @@ bool wxDebugContext::PrintStatistics(bool detailed)
 
   wxDebugStatsStruct *list = NULL;
 
-  wxMemStruct *from = (checkPoint ? checkPoint->m_next : NULL);
+  wxMemStruct *from = (checkPoint ? checkPoint->m_next : (wxMemStruct*)NULL );
   if (!from)
     from = wxDebugContext::GetHead ();
 
@@ -758,6 +792,7 @@ bool wxDebugContext::PrintStatistics(bool detailed)
   wxTrace("Number of object items: %ld\n", noObjectNodes);
   wxTrace("Number of non-object items: %ld\n", noNonObjectNodes);
   wxTrace("Total allocated size: %ld\n", totalSize);
+  wxTrace("\n\n");
 
   return TRUE;
 #else
@@ -778,14 +813,19 @@ bool wxDebugContext::PrintClasses(void)
     {
         appNameStr = wxTheApp->GetAppName();
         appName = (char*) (const char*) appNameStr;
-        wxTrace("Classes in %s:\n\n", appName);
+        wxTrace("----- Classes in %s -----\n", appName);
     }
   }
 
   int n = 0;
-  wxClassInfo *info = wxClassInfo::first;
-  while (info)
+  wxNode *node;
+  wxClassInfo *info;
+
+  wxClassInfo::sm_classTable->BeginFind();
+  node = wxClassInfo::sm_classTable->Next();
+  while (node)
   {
+    info = (wxClassInfo *)node->Data();
     if (info->GetClassName())
     {
       wxTrace("%s ", info->GetClassName());
@@ -794,15 +834,15 @@ bool wxDebugContext::PrintClasses(void)
         wxTrace("is a %s", info->GetBaseClassName1());
       else if (info->GetBaseClassName1() && info->GetBaseClassName2())
         wxTrace("is a %s, %s", info->GetBaseClassName1(), info->GetBaseClassName2());
-      if (info->objectConstructor)
+      if (info->GetConstructor())
         wxTrace(": dynamic\n");
       else
         wxTrace("\n");
     }
-    info = info->next;
+    node = wxClassInfo::sm_classTable->Next();
     n ++;
   }
-  wxTrace("\nThere are %d classes derived from wxObject.\n", n);
+  wxTrace("\nThere are %d classes derived from wxObject.\n\n\n", n);
   return TRUE;
 }    
 
@@ -819,7 +859,7 @@ int wxDebugContext::Check(bool checkAll)
 {
   int nFailures = 0;
     
-  wxMemStruct *from = (checkPoint ? checkPoint->m_next : NULL);
+  wxMemStruct *from = (checkPoint ? checkPoint->m_next : (wxMemStruct*)NULL );
   if (!from || checkAll)
     from = wxDebugContext::GetHead ();
 
@@ -860,7 +900,7 @@ int wxDebugContext::CountObjectsLeft(void)
 // We'll only do malloc and free for the moment: leave the interesting
 // stuff for the wxObject versions.
 
-#if DEBUG && USE_GLOBAL_MEMORY_OPERATORS
+#if WXDEBUG && wxUSE_GLOBAL_MEMORY_OPERATORS
 
 #ifdef new
 #undef new
@@ -884,7 +924,7 @@ void * operator new (size_t size, char * fileName, int lineNum)
 #endif
 }
 
-#if !( defined (_MSC_VER) && (_MSC_VER <= 1000) )
+#if !( defined (_MSC_VER) && (_MSC_VER <= 1020) )
 void * operator new[] (size_t size, char * fileName, int lineNum)
 {
 #ifdef NO_DEBUG_ALLOCATION
@@ -904,7 +944,15 @@ void operator delete (void * buf)
 #endif
 }
 
-#if !( defined (_MSC_VER) && (_MSC_VER <= 1000) )
+// VC++ 6.0
+#if _MSC_VER >= 1200
+void operator delete(void* pData, char* /* fileName */, int /* lineNum */)
+{
+ ::operator delete(pData);
+}
+#endif
+
+#if !( defined (_MSC_VER) && (_MSC_VER <= 1020) )
 void operator delete[] (void * buf)
 {
 #ifdef NO_DEBUG_ALLOCATION
@@ -918,7 +966,7 @@ void operator delete[] (void * buf)
 #endif
 
 // TODO: store whether this is a vector or not.
-void * wxDebugAlloc(size_t size, char * fileName, int lineNum, bool isObject, bool isVect)
+void * wxDebugAlloc(size_t size, char * fileName, int lineNum, bool isObject, bool WXUNUSED(isVect) )
 {
   // If not in debugging allocation mode, do the normal thing
   // so we don't leave any trace of ourselves in the node list.
@@ -969,7 +1017,7 @@ void * wxDebugAlloc(size_t size, char * fileName, int lineNum, bool isObject, bo
 }
 
 // TODO: check whether was allocated as a vector
-void wxDebugFree(void * buf, bool isVect)
+void wxDebugFree(void * buf, bool WXUNUSED(isVect) )
 {
   if (!buf)
     return;
@@ -1021,7 +1069,7 @@ void wxTrace(const char *fmt ...)
 
   va_start(ap, fmt);
 
-#ifdef __WINDOWS__
+#ifdef __WXMSW__
   wvsprintf(buffer,fmt,ap) ;
 #else
   vsprintf(buffer,fmt,ap) ;
@@ -1035,7 +1083,7 @@ void wxTrace(const char *fmt ...)
     wxDebugContext::GetStream().flush();
   }
   else
-#ifdef __WINDOWS__
+#ifdef __WXMSW__
     OutputDebugString((LPCSTR)buffer) ;
 #else
     fprintf(stderr, buffer);
@@ -1053,7 +1101,7 @@ void wxTraceLevel(int level, const char *fmt ...)
 
   va_start(ap, fmt);
 
-#ifdef __WINDOWS__
+#ifdef __WXMSW__
   wvsprintf(buffer,fmt,ap) ;
 #else
   vsprintf(buffer,fmt,ap) ;
@@ -1067,14 +1115,14 @@ void wxTraceLevel(int level, const char *fmt ...)
     wxDebugContext::GetStream().flush();
   }
   else
-#ifdef __WINDOWS__
+#ifdef __WXMSW__
     OutputDebugString((LPCSTR)buffer) ;
 #else
     fprintf(stderr, buffer);
 #endif
 }
 
-#else // USE_MEMORY_TRACING && DEBUG
+#else // wxUSE_MEMORY_TRACING && WXDEBUG
 void wxTrace(const char *WXUNUSED(fmt) ...)
 {
 }