#endif // wxUSE_THREADS
+// return true if we have a non NULL non disabled log target
+static inline bool IsLoggingEnabled()
+{
+ return wxLog::IsEnabled() && (wxLog::GetActiveTarget() != NULL);
+}
+
// ----------------------------------------------------------------------------
// implementation of Log functions
//
// generic log function
void wxLogGeneric(wxLogLevel level, const wxChar *szFormat, ...)
{
- if ( wxLog::GetActiveTarget() != NULL ) {
- wxCRIT_SECT_LOCKER(locker, gs_csLogBuf);
+ if ( IsLoggingEnabled() ) {
+ wxCRIT_SECT_LOCKER(locker, gs_csLogBuf);
- va_list argptr;
- va_start(argptr, szFormat);
- wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr);
- va_end(argptr);
+ va_list argptr;
+ va_start(argptr, szFormat);
+ wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr);
+ va_end(argptr);
- wxLog::OnLog(level, s_szBuf, time(NULL));
- }
+ wxLog::OnLog(level, s_szBuf, time(NULL));
+ }
}
-#define IMPLEMENT_LOG_FUNCTION(level) \
- void wxLog##level(const wxChar *szFormat, ...) \
- { \
- if ( wxLog::GetActiveTarget() != NULL ) { \
- wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); \
- \
- va_list argptr; \
- va_start(argptr, szFormat); \
- wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr); \
- va_end(argptr); \
- \
- wxLog::OnLog(wxLOG_##level, s_szBuf, time(NULL)); \
- } \
+#define IMPLEMENT_LOG_FUNCTION(level) \
+ void wxLog##level(const wxChar *szFormat, ...) \
+ { \
+ if ( IsLoggingEnabled() ) { \
+ wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); \
+ \
+ va_list argptr; \
+ va_start(argptr, szFormat); \
+ wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr); \
+ va_end(argptr); \
+ \
+ wxLog::OnLog(wxLOG_##level, s_szBuf, time(NULL)); \
+ } \
}
IMPLEMENT_LOG_FUNCTION(FatalError)
// same as info, but only if 'verbose' mode is on
void wxLogVerbose(const wxChar *szFormat, ...)
{
- wxLog *pLog = wxLog::GetActiveTarget();
- if ( pLog != NULL && pLog->GetVerbose() ) {
- wxCRIT_SECT_LOCKER(locker, gs_csLogBuf);
+ if ( IsLoggingEnabled() ) {
+ wxLog *pLog = wxLog::GetActiveTarget();
+ if ( pLog != NULL && pLog->GetVerbose() ) {
+ wxCRIT_SECT_LOCKER(locker, gs_csLogBuf);
- va_list argptr;
- va_start(argptr, szFormat);
- wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr);
- va_end(argptr);
+ va_list argptr;
+ va_start(argptr, szFormat);
+ wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr);
+ va_end(argptr);
- wxLog::OnLog(wxLOG_Info, s_szBuf, time(NULL));
- }
+ wxLog::OnLog(wxLOG_Info, s_szBuf, time(NULL));
+ }
+ }
}
// debug functions
#ifdef __WXDEBUG__
-#define IMPLEMENT_LOG_DEBUG_FUNCTION(level) \
- void wxLog##level(const wxChar *szFormat, ...) \
- { \
- if ( wxLog::GetActiveTarget() != NULL ) { \
- wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); \
- \
- va_list argptr; \
- va_start(argptr, szFormat); \
- wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr); \
- va_end(argptr); \
- \
- wxLog::OnLog(wxLOG_##level, s_szBuf, time(NULL)); \
- } \
+#define IMPLEMENT_LOG_DEBUG_FUNCTION(level) \
+ void wxLog##level(const wxChar *szFormat, ...) \
+ { \
+ if ( IsLoggingEnabled() ) { \
+ wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); \
+ \
+ va_list argptr; \
+ va_start(argptr, szFormat); \
+ wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr); \
+ va_end(argptr); \
+ \
+ wxLog::OnLog(wxLOG_##level, s_szBuf, time(NULL)); \
+ } \
}
void wxLogTrace(const wxChar *mask, const wxChar *szFormat, ...)
{
- wxLog *pLog = wxLog::GetActiveTarget();
-
- if ( pLog != NULL && wxLog::IsAllowedTraceMask(mask) ) {
+ if ( IsLoggingEnabled() && wxLog::IsAllowedTraceMask(mask) ) {
wxCRIT_SECT_LOCKER(locker, gs_csLogBuf);
wxChar *p = s_szBuf;
void wxLogTrace(wxTraceMask mask, const wxChar *szFormat, ...)
{
- wxLog *pLog = wxLog::GetActiveTarget();
-
// we check that all of mask bits are set in the current mask, so
// that wxLogTrace(wxTraceRefCount | wxTraceOle) will only do something
// if both bits are set.
- if ( pLog != NULL && ((pLog->GetTraceMask() & mask) == mask) ) {
+ if ( IsLoggingEnabled() && ((wxLog::GetTraceMask() & mask) == mask) ) {
wxCRIT_SECT_LOCKER(locker, gs_csLogBuf);
va_list argptr;
void WXDLLEXPORT wxLogSysError(const wxChar *szFormat, ...)
{
- wxCRIT_SECT_LOCKER(locker, gs_csLogBuf);
+ if ( IsLoggingEnabled() ) {
+ wxCRIT_SECT_LOCKER(locker, gs_csLogBuf);
- va_list argptr;
- va_start(argptr, szFormat);
- wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr);
- va_end(argptr);
+ va_list argptr;
+ va_start(argptr, szFormat);
+ wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr);
+ va_end(argptr);
- wxLogSysErrorHelper(wxSysErrorCode());
+ wxLogSysErrorHelper(wxSysErrorCode());
+ }
}
void WXDLLEXPORT wxLogSysError(long lErrCode, const wxChar *szFormat, ...)
{
- wxCRIT_SECT_LOCKER(locker, gs_csLogBuf);
+ if ( IsLoggingEnabled() ) {
+ wxCRIT_SECT_LOCKER(locker, gs_csLogBuf);
- va_list argptr;
- va_start(argptr, szFormat);
- wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr);
- va_end(argptr);
+ va_list argptr;
+ va_start(argptr, szFormat);
+ wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr);
+ va_end(argptr);
- wxLogSysErrorHelper(lErrCode);
+ wxLogSysErrorHelper(lErrCode);
+ }
}
// ----------------------------------------------------------------------------
return pOldLogger;
}
+void wxLog::DontCreateOnDemand()
+{
+ ms_bAutoCreate = FALSE;
+
+ // this is usually called at the end of the program and we assume that it
+ // is *always* called at the end - so we free memory here to avoid false
+ // memory leak reports from wxWin memory tracking code
+ ClearTraceMasks();
+}
+
void wxLog::RemoveTraceMask(const wxString& str)
{
int index = ms_aTraceMasks.Index(str);
ms_aTraceMasks.Remove((size_t)index);
}
+void wxLog::ClearTraceMasks()
+{
+ ms_aTraceMasks.Clear();
+}
+
void wxLog::TimeStamp(wxString *str)
{
if ( ms_timestamp )
m_fp = fp;
}
-#if defined(__WXMAC__)
+#if defined(__WXMAC__) && !defined(__UNIX__)
#define kDebuggerSignature 'MWDB'
static Boolean FindProcessBySignature(OSType signature, ProcessInfoRec* info)
str += wxT("\r\n") ;
OutputDebugString(str.c_str());
#endif // MSW
-#if defined(__WXMAC__) && wxUSE_GUI
+#if defined(__WXMAC__) && !defined(__WXMAC_X__) && wxUSE_GUI
Str255 pstr ;
strcpy( (char*) pstr , str.c_str() ) ;
strcat( (char*) pstr , ";g" ) ;
DebugStr(pstr);
#endif
}
-#endif // MSW
+#endif // Mac
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#if wxUSE_STD_IOSTREAM
-wxLogStream::wxLogStream(ostream *ostr)
+wxLogStream::wxLogStream(wxSTD ostream *ostr)
{
if ( ostr == NULL )
- m_ostr = &cerr;
+ m_ostr = &wxSTD cerr;
else
m_ostr = ostr;
}
{
wxString str;
TimeStamp(&str);
- (*m_ostr) << str << wxConvertWX2MB(szString) << endl;
+ (*m_ostr) << str << wxConvertWX2MB(szString) << wxSTD endl;
}
#endif // wxUSE_STD_IOSTREAM
#ifdef __WXDEBUG__
+// wxASSERT() helper
+bool wxAssertIsEqual(int x, int y)
+{
+ return x == y;
+}
+
// break into the debugger
-void Trap()
+void wxTrap()
{
#ifdef __WXMSW__
DebugBreak();
if ( s_bInAssert ) {
// He-e-e-e-elp!! we're trapped in endless loop
- Trap();
+ wxTrap();
s_bInAssert = FALSE;
// send it to the normal log destination
wxLogDebug(szBuf);
-#if wxUSE_GUI || defined(__WXMSW__)
+#if (wxUSE_GUI && wxUSE_MSGDLG) || defined(__WXMSW__)
// this message is intentionally not translated - it is for
// developpers only
wxStrcat(szBuf, wxT("\nDo you want to stop the program?\nYou can also choose [Cancel] to suppress further warnings."));
switch ( ::MessageBox(NULL, szBuf, _T("Debug"),
MB_YESNOCANCEL | MB_ICONSTOP ) ) {
case IDYES:
- Trap();
+ wxTrap();
break;
case IDCANCEL:
switch ( wxMessageBox(szBuf, wxT("Debug"),
wxYES_NO | wxCANCEL | wxICON_STOP ) ) {
case wxYES:
- Trap();
+ wxTrap();
break;
case wxCANCEL:
#endif // GUI or MSW
#else // !GUI
- Trap();
+ wxTrap();
#endif // GUI/!GUI
}