#include "wx/defs.h"
#endif
-#if (WXDEBUG && USE_MEMORY_TRACING) || USE_DEBUG_CONTEXT
+#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
#ifdef __GNUG__
// #pragma implementation
#include "wx/app.h"
#endif
+#include <wx/log.h>
#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>
*/
void wxMemStruct::ErrorMsg (const char * mesg)
{
- wxTrace("wxWindows memory checking error: %s\n", mesg);
+ wxLogDebug("wxWindows memory checking error: %s", mesg);
PrintNode ();
// << m_fileName << ' ' << m_lineNum << endl;
*/
void wxMemStruct::ErrorMsg ()
{
- wxTrace("wxWindows over/underwrite memory error: \n");
+ wxLogDebug("wxWindows over/underwrite memory error:");
PrintNode ();
// cerr << m_fileName << ' ' << m_lineNum << endl;
wxObject *obj = (wxObject *)m_actualData;
wxClassInfo *info = obj->GetClassInfo();
+ // Let's put this in standard form so IDEs can load the file at the appropriate
+ // line
+ wxString msg("");
+
+ if (m_fileName)
+ msg.Printf("%s(%d): ", m_fileName, (int)m_lineNum);
+
if (info && info->GetClassName())
- wxTrace("%s", info->GetClassName());
+ msg += info->GetClassName();
else
- wxTrace("Object");
+ msg += "object";
- if (m_fileName)
- wxTrace(" (%s %d)", m_fileName, (int)m_lineNum);
+ wxString msg2;
+ msg2.Printf(" at $%lX, size %d", (long)GetActualData(), (int)RequestSize());
+ msg += msg2;
- wxTrace(" at $%lX, size %d\n", (long)GetActualData(), (int)RequestSize());
+ wxLogDebug(msg);
}
else
{
- wxTrace("Non-object data");
+ wxString msg("");
+
if (m_fileName)
- wxTrace(" (%s %d)", m_fileName, (int)m_lineNum);
- wxTrace(" at $%lX, size %d\n", (long)GetActualData(), (int)RequestSize());
+ msg.Printf("%s(%d): ", m_fileName, (int)m_lineNum);
+ msg += ("non-object data");
+ wxString msg2;
+ msg2.Printf(" at $%lX, size %d\n", (long)GetActualData(), (int)RequestSize());
+ msg += msg2;
+
+ wxLogDebug(msg);
}
}
if (m_isObject)
{
wxObject *obj = (wxObject *)m_actualData;
-// wxClassInfo *info = obj->GetClassInfo();
+ wxString msg("");
if (m_fileName)
- wxTrace("Item (%s %d)", m_fileName, (int)m_lineNum);
- else
- wxTrace("Item");
+ msg.Printf("%s(%d): ", m_fileName, (int)m_lineNum);
+
- wxTrace(" at $%lX, size %d: ", (long)GetActualData(), (int)RequestSize());
-// wxTrace(info->GetClassName());
+ /* TODO: We no longer have a stream (using wxLogDebug) so we can't dump it.
+ * Instead, do what wxObject::Dump does.
+ * What should we do long-term, eliminate Dumping? Or specify
+ * that MyClass::Dump should use wxLogDebug? Ugh.
obj->Dump(wxDebugContext::GetStream());
- wxTrace("\n");
+ */
+
+ if (obj->GetClassInfo() && obj->GetClassInfo()->GetClassName())
+ msg += obj->GetClassInfo()->GetClassName();
+ else
+ msg += "unknown object class";
+
+ wxString msg2("");
+ msg2.Printf(" at $%lX, size %d", (long)GetActualData(), (int)RequestSize());
+ msg += msg2;
+
+ wxLogDebug(msg);
}
else
{
- wxTrace("Non-object data");
+ wxString msg("");
if (m_fileName)
- wxTrace(" (%s %d)", m_fileName, (int)m_lineNum);
- wxTrace(" at $%lX, size %d\n", (long)GetActualData(), (int)RequestSize());
+ msg.Printf("%s(%d): ", m_fileName, (int)m_lineNum);
+
+ wxString msg2("");
+ msg2.Printf("non-object data at $%lX, size %d", (long)GetActualData(), (int)RequestSize() );
+ msg += msg2;
+ wxLogDebug(msg);
}
}
else {
// Can't use the error routines as we have no recognisable object.
#ifndef __WXGTK__
- wxTrace("Can't verify memory struct - all bets are off!\n");
+ wxLogDebug("Can't verify memory struct - all bets are off!");
#endif
}
return 0;
void wxDebugContext::SetStream(ostream *str, streambuf *buf)
{
-/*
- if (str)
- {
- char buff[128];
- sprintf(buff, "SetStream (1): str is %ld", (long) str);
- MessageBox(NULL, buff, "Memory", MB_OK);
- }
-*/
-
if (m_debugStream)
{
m_debugStream->flush();
}
else
{
-/*
- char buf[40];
- sprintf(buf, "SetFile: str is %ld", (long) str);
- MessageBox(NULL, buf, "Memory", MB_OK);
-*/
SetStream(str);
return TRUE;
}
for (wxMemStruct * st = from; st != 0; st = st->m_next)
{
void* data = st->GetActualData();
- if ((data != (void*)m_debugStream) && (data != (void*) m_streamBuf))
+// if ((data != (void*)m_debugStream) && (data != (void*) m_streamBuf))
+ if (data != (void*) wxLog::GetActiveTarget())
{
(st->*func) ();
}
*/
bool wxDebugContext::PrintList (void)
{
-#if WXDEBUG
- if (!HasStream())
- return FALSE;
+#ifdef __WXDEBUG__
+// if (!HasStream())
+// return FALSE;
TraverseList ((PmSFV)&wxMemStruct::PrintNode, (checkPoint ? checkPoint->m_next : (wxMemStruct*)NULL));
bool wxDebugContext::Dump(void)
{
-#if WXDEBUG
- if (!HasStream())
- return FALSE;
+#ifdef __WXDEBUG__
+// if (!HasStream())
+// return FALSE;
if (TRUE)
{
{
appNameStr = wxTheApp->GetAppName();
appName = (char*) (const char*) appNameStr;
- wxTrace("----- Memory dump of %s at %s -----\n", appName, WXSTRINGCAST wxNow() );
+ wxLogDebug("----- Memory dump of %s at %s -----", appName, WXSTRINGCAST wxNow() );
}
else
{
- wxTrace( "----- Memory dump -----\n" );
+ wxLogDebug( "----- Memory dump -----" );
}
}
TraverseList ((PmSFV)&wxMemStruct::Dump, (checkPoint ? checkPoint->m_next : (wxMemStruct*)NULL));
- wxTrace( "\n\n" );
+ wxLogDebug( "" );
+ wxLogDebug( "" );
return TRUE;
#else
bool wxDebugContext::PrintStatistics(bool detailed)
{
-#if WXDEBUG
- if (!HasStream())
- return FALSE;
+#ifdef __WXDEBUG__
+// if (!HasStream())
+// return FALSE;
if (TRUE)
{
{
appNameStr = wxTheApp->GetAppName();
appName = (char*) (const char*) appNameStr;
- wxTrace("----- Memory statistics of %s at %s -----\n", appName, WXSTRINGCAST wxNow() );
+ wxLogDebug("----- Memory statistics of %s at %s -----", appName, WXSTRINGCAST wxNow() );
}
else
{
- wxTrace( "----- Memory statistics -----\n" );
+ wxLogDebug( "----- Memory statistics -----" );
}
}
for (st = from; st != 0; st = st->m_next)
{
void* data = st->GetActualData();
- if (detailed && (data != (void*)m_debugStream) && (data != (void*) m_streamBuf))
+// if (detailed && (data != (void*)m_debugStream) && (data != (void*) m_streamBuf))
+ if (detailed && (data != (void*) wxLog::GetActiveTarget()))
{
char *className = "nonobject";
if (st->m_isObject && st->GetActualData())
stats->totalSize += st->RequestSize();
}
- if ((data != (void*)m_debugStream) && (data != (void*) m_streamBuf))
+// if ((data != (void*)m_debugStream) && (data != (void*) m_streamBuf))
+ if (data != (void*) wxLog::GetActiveTarget())
{
totalSize += st->RequestSize();
if (st->m_isObject)
{
while (list)
{
- wxTrace("%ld objects of class %s, total size %ld\n",
+ wxLogDebug("%ld objects of class %s, total size %ld",
list->instanceCount, list->instanceClass, list->totalSize);
wxDebugStatsStruct *old = list;
list = old->next;
free((char *)old);
}
- wxTrace("\n");
+ wxLogDebug("");
}
SetDebugMode(currentMode);
- 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");
+ wxLogDebug("Number of object items: %ld", noObjectNodes);
+ wxLogDebug("Number of non-object items: %ld", noNonObjectNodes);
+ wxLogDebug("Total allocated size: %ld", totalSize);
+ wxLogDebug("");
+ wxLogDebug("");
return TRUE;
#else
bool wxDebugContext::PrintClasses(void)
{
- if (!HasStream())
- return FALSE;
+// if (!HasStream())
+// return FALSE;
if (TRUE)
{
{
appNameStr = wxTheApp->GetAppName();
appName = (char*) (const char*) appNameStr;
- wxTrace("----- Classes in %s -----\n", appName);
+ wxLogDebug("----- Classes in %s -----", appName);
}
}
info = (wxClassInfo *)node->Data();
if (info->GetClassName())
{
- wxTrace("%s ", info->GetClassName());
-
- if (info->GetBaseClassName1() && !info->GetBaseClassName2())
- wxTrace("is a %s", info->GetBaseClassName1());
- else if (info->GetBaseClassName1() && info->GetBaseClassName2())
- wxTrace("is a %s, %s", info->GetBaseClassName1(), info->GetBaseClassName2());
- if (info->GetConstructor())
- wxTrace(": dynamic\n");
- else
- wxTrace("\n");
+ wxString msg(info->GetClassName());
+ msg += " ";
+
+ if (info->GetBaseClassName1() && !info->GetBaseClassName2())
+ {
+ msg += "is a ";
+ msg += info->GetBaseClassName1();
+ }
+ else if (info->GetBaseClassName1() && info->GetBaseClassName2())
+ {
+ msg += "is a ";
+ msg += info->GetBaseClassName1() ;
+ msg += ", ";
+ msg += info->GetBaseClassName2() ;
+ }
+ if (info->GetConstructor())
+ msg += ": dynamic";
+
+ wxLogDebug(msg);
}
node = wxClassInfo::sm_classTable->Next();
n ++;
}
- wxTrace("\nThere are %d classes derived from wxObject.\n\n\n", n);
+ wxLogDebug("");
+ wxLogDebug("There are %d classes derived from wxObject.", n);
+ wxLogDebug("");
+ wxLogDebug("");
return TRUE;
}
// Count the number of non-wxDebugContext-related objects
// that are outstanding
-int wxDebugContext::CountObjectsLeft(void)
+int wxDebugContext::CountObjectsLeft(bool sinceCheckpoint)
{
int n = 0;
-
- wxMemStruct *from = wxDebugContext::GetHead ();
+
+ wxMemStruct *from = NULL;
+ if (sinceCheckpoint && checkPoint)
+ from = checkPoint->m_next;
+ if (from == (wxMemStruct*) NULL)
+ from = wxDebugContext::GetHead () ;
for (wxMemStruct * st = from; st != 0; st = st->m_next)
{
void* data = st->GetActualData();
- if ((data != (void*)m_debugStream) && (data != (void*) m_streamBuf))
+// if ((data != (void*)m_debugStream) && (data != (void*) m_streamBuf))
+ if (data != (void*) wxLog::GetActiveTarget())
n ++;
}
// We'll only do malloc and free for the moment: leave the interesting
// stuff for the wxObject versions.
-#if WXDEBUG && USE_GLOBAL_MEMORY_OPERATORS
+#if defined(__WXDEBUG__) && wxUSE_GLOBAL_MEMORY_OPERATORS
#ifdef new
#undef new
#endif
}
+// Added JACS 25/11/98
+void * operator new (size_t size)
+{
+#ifdef NO_DEBUG_ALLOCATION
+ return malloc(size);
+#else
+ return wxDebugAlloc(size, NULL, 0, FALSE);
+#endif
+}
+
+void * operator new[] (size_t size)
+{
+#ifdef NO_DEBUG_ALLOCATION
+ return malloc(size);
+#else
+ return wxDebugAlloc(size, NULL, 0, FALSE, TRUE);
+#endif
+}
+
#if !( defined (_MSC_VER) && (_MSC_VER <= 1020) )
void * operator new[] (size_t size, char * fileName, int lineNum)
{
#endif
}
+// VC++ 6.0
+#if _MSC_VER >= 1200
+void operator delete(void* pData, char* /* fileName */, int /* lineNum */)
+{
+// ::operator delete(pData);
+ // JACS 21/11/1998: surely we need to call wxDebugFree?
+ wxDebugFree(pData, FALSE);
+}
+// New operator 21/11/1998
+void operator delete[](void* pData, char* /* fileName */, int /* lineNum */)
+{
+ wxDebugFree(pData, TRUE);
+}
+#endif
+
#if !( defined (_MSC_VER) && (_MSC_VER <= 1020) )
+
void operator delete[] (void * buf)
{
#ifdef NO_DEBUG_ALLOCATION
char * buf = (char *) malloc(wxDebugContext::TotSize (size));
if (!buf) {
- wxTrace("Call to malloc (%ld) failed.\n", (long)size);
+ wxLogDebug("Call to malloc (%ld) failed.", (long)size);
return 0;
}
wxMemStruct * st = (wxMemStruct *)buf;
#endif
}
-#else // USE_MEMORY_TRACING && WXDEBUG
+#else // wxUSE_MEMORY_TRACING && defined(__WXDEBUG__)
void wxTrace(const char *WXUNUSED(fmt) ...)
{
}