TRACE_MANAGER: very simple run-time tracing infrastructure

This commit is contained in:
Tomasz Wlostowski 2021-11-28 21:50:49 +01:00
parent 2f8ad08739
commit ee8b2113a8
2 changed files with 96 additions and 0 deletions

View File

@ -29,6 +29,7 @@
#include <trace_helpers.h>
#include <wx/tokenzr.h>
const wxChar* const traceFindReplace = wxT( "KICAD_FIND_REPLACE" );
const wxChar* const kicadTraceCoords = wxT( "KICAD_COORDS" );
@ -275,3 +276,55 @@ wxString dump( const wxKeyEvent& aEvent )
return msg;
}
TRACE_MANAGER& TRACE_MANAGER::Instance()
{
static TRACE_MANAGER* self = nullptr;
if( !self )
{
self = new TRACE_MANAGER;
self->init();
}
return *self;
}
void TRACE_MANAGER::traceV( const wxString& aWhat, const wxString& aFmt, va_list vargs )
{
if( !m_printAllTraces )
{
if( !m_globalTraceEnabled )
return;
if( m_enabledTraces.find( aWhat ) == m_enabledTraces.end() )
return;
}
wxString str;
str.PrintfV( aFmt, vargs );
#ifdef __unix__
fprintf( stderr, " %-30s | %s", aWhat.c_str().AsChar(), str.c_str().AsChar() );
#endif
}
void TRACE_MANAGER::init()
{
wxString traceVars;
m_globalTraceEnabled = wxGetEnv( wxT( "KICAD_TRACE" ), &traceVars );
m_printAllTraces = false;
if( !m_globalTraceEnabled )
return;
wxStringTokenizer tokenizer( traceVars, wxT( "," ) );
while( tokenizer.HasMoreTokens() )
{
wxString token = tokenizer.GetNextToken();
m_enabledTraces[token] = true;
if( token == wxT( "all" ) )
m_printAllTraces = true;
}
}

View File

@ -34,6 +34,9 @@
#include <wx/event.h>
#include <wx/string.h>
#include <stdarg.h>
#include <map>
/**
* @defgroup trace_env_vars Trace Environment Variables
*
@ -213,4 +216,44 @@ extern wxString dump( const wxKeyEvent& aEvent );
*/
extern wxString dump( const wxArrayString& aArray );
class TRACE_MANAGER
{
public:
TRACE_MANAGER(){};
~TRACE_MANAGER(){};
static TRACE_MANAGER& Instance();
WX_DEFINE_VARARG_FUNC_VOID( Trace, 2, (const wxString, const wxFormatString&), DoTrace,
DoTraceUtf8 )
void DoTrace( const wxString aWhat, const wxChar* aFmt, ... )
{
va_list argptr;
va_start( argptr, aFmt );
traceV( aWhat, aFmt, argptr );
va_end( argptr );
}
#if wxUSE_UNICODE_UTF8
void DoTraceUtf8( const wxString aWhat, const wxChar* aFmt, ... )
{
va_list argptr;
va_start( argptr, format );
traceV( aWhat, aFmt, argptr );
va_end( argptr );
}
#endif
private:
void traceV( const wxString& aWhat, const wxString& aFmt, va_list vargs );
void init();
std::map<wxString, bool> m_enabledTraces;
bool m_globalTraceEnabled;
bool m_printAllTraces;
};
#define KI_TRACE( ... ) TRACE_MANAGER::Instance().Trace( __VA_ARGS__ )
#endif // _TRACE_HELPERS_H_