OK, I will add two functions: wxEVT_SCI_XXX to string, and cbEVT_XXXX to string later.
Now, I have measurement for both for editor hook(wx Scintilla event hook), and cbEvent, this is the new patch:
Index: include/cbfunctor.h
===================================================================
--- include/cbfunctor.h (revision 9090)
+++ include/cbfunctor.h (working copy)
@@ -5,13 +5,14 @@
#ifndef CB_FUNCTOR_H
#define CB_FUNCTOR_H
-
+#include <typeinfo>
/** Base abstract functor class. All functors must extend this interface. */
class IFunctorBase
{
public:
virtual ~IFunctorBase(){}
virtual void* GetThis() = 0;
+ virtual const char* GetTypeName() = 0;
};
/** Base abstract event functor class. All event functors must extend this interface.*/
@@ -33,6 +34,7 @@
cbEventFunctor(const cbEventFunctor<ClassType, EventType>& rhs) : m_pThis(rhs.m_pThis), m_pMember(rhs.m_pMember) {}
virtual void* GetThis() { return m_pThis; }
virtual void Call(EventType& event) { if (m_pThis) (m_pThis->*m_pMember)(event); }
+ virtual const char* GetTypeName(){return typeid(m_pMember).name();}
};
#endif // CB_FUNCTOR_H
Index: include/editor_hooks.h
===================================================================
--- include/editor_hooks.h (revision 9090)
+++ include/editor_hooks.h (working copy)
@@ -7,6 +7,7 @@
#define EDITOR_HOOKS_H
#include "settings.h"
+#include <typeinfo>
class cbEditor;
class cbSmartIndentPlugin;
@@ -21,6 +22,7 @@
public:
virtual ~HookFunctorBase(){}
virtual void Call(cbEditor*, wxScintillaEvent&) const = 0;
+ virtual const char* GetTypeName() const = 0;
};
/** Functor class for use as a editor modification operations hook.
@@ -48,6 +50,10 @@
if (m_pObj && m_pFunc)
(m_pObj->*m_pFunc)(editor, event);
}
+ virtual const char* GetTypeName() const
+ {
+ return typeid(m_pFunc).name();
+ }
protected:
T* m_pObj;
Func m_pFunc;
@@ -91,6 +97,10 @@
* @param event The wxScintilla event fired to react accordingly (see cbEditor::CreateEditor, namely scintilla_events)
*/
virtual void Call(cbEditor* editor, wxScintillaEvent& event) const;
+ virtual const char* GetTypeName() const
+ {
+ return typeid(m_plugin).name();
+ }
private:
cbSmartIndentPlugin* m_plugin;
};
Index: sdk/editor_hooks.cpp
===================================================================
--- sdk/editor_hooks.cpp (revision 9090)
+++ sdk/editor_hooks.cpp (working copy)
@@ -14,6 +14,9 @@
#include "cbplugin.h"
#endif
+#include <cxxabi.h>
+#include <cstdlib>
+
#include "editor_hooks.h"
#include "wx/wxscintilla.h"
@@ -66,7 +69,51 @@
{
EditorHooks::HookFunctorBase* functor = it->second;
if (functor)
+ {
+ wxStopWatch sw;
functor->Call(editor, event);
+ if(sw.Time() < 10) // only print a handler run longer than 10 ms
+ continue;
+
+ const char *p = functor->GetTypeName();
+ int status;
+ char *realname;
+ realname = abi::__cxa_demangle(p, 0, 0, &status);
+ wxString txt = wxString::FromUTF8(realname);
+ free(realname);
+ wxEventType type = event.GetEventType();
+ if (type == wxEVT_SCI_CHANGE) txt << _T("wxEVT_SCI_CHANGE");
+ else if (type == wxEVT_SCI_STYLENEEDED) txt << _T("wxEVT_SCI_STYLENEEDED");
+ else if (type == wxEVT_SCI_CHARADDED) txt << _T("wxEVT_SCI_CHARADDED");
+ else if (type == wxEVT_SCI_SAVEPOINTREACHED) txt << _T("wxEVT_SCI_SAVEPOINTREACHED");
+ else if (type == wxEVT_SCI_SAVEPOINTLEFT) txt << _T("wxEVT_SCI_SAVEPOINTLEFT");
+ else if (type == wxEVT_SCI_ROMODIFYATTEMPT) txt << _T("wxEVT_SCI_ROMODIFYATTEMPT");
+ else if (type == wxEVT_SCI_KEY) txt << _T("wxEVT_SCI_KEY");
+ else if (type == wxEVT_SCI_DOUBLECLICK) txt << _T("wxEVT_SCI_DOUBLECLICK");
+ else if (type == wxEVT_SCI_UPDATEUI) txt << _T("wxEVT_SCI_UPDATEUI");
+ else if (type == wxEVT_SCI_MODIFIED) txt << _T("wxEVT_SCI_MODIFIED");
+ else if (type == wxEVT_SCI_MACRORECORD) txt << _T("wxEVT_SCI_MACRORECORD");
+ else if (type == wxEVT_SCI_MARGINCLICK) txt << _T("wxEVT_SCI_MARGINCLICK");
+ else if (type == wxEVT_SCI_NEEDSHOWN) txt << _T("wxEVT_SCI_NEEDSHOWN");
+ else if (type == wxEVT_SCI_PAINTED) txt << _T("wxEVT_SCI_PAINTED");
+ else if (type == wxEVT_SCI_USERLISTSELECTION) txt << _T("wxEVT_SCI_USERLISTSELECTION");
+ else if (type == wxEVT_SCI_URIDROPPED) txt << _T("wxEVT_SCI_URIDROPPED");
+ else if (type == wxEVT_SCI_DWELLSTART) txt << _T("wxEVT_SCI_DWELLSTART");
+ else if (type == wxEVT_SCI_DWELLEND) txt << _T("wxEVT_SCI_DWELLEND");
+ else if (type == wxEVT_SCI_START_DRAG) txt << _T("wxEVT_SCI_START_DRAG");
+ else if (type == wxEVT_SCI_DRAG_OVER) txt << _T("wxEVT_SCI_DRAG_OVER");
+ else if (type == wxEVT_SCI_DO_DROP) txt << _T("wxEVT_SCI_DO_DROP");
+ else if (type == wxEVT_SCI_ZOOM) txt << _T("wxEVT_SCI_ZOOM");
+ else if (type == wxEVT_SCI_HOTSPOT_CLICK) txt << _T("wxEVT_SCI_HOTSPOT_CLICK");
+ else if (type == wxEVT_SCI_HOTSPOT_DCLICK) txt << _T("wxEVT_SCI_HOTSPOT_DCLICK");
+ else if (type == wxEVT_SCI_CALLTIP_CLICK) txt << _T("wxEVT_SCI_CALLTIP_CLICK");
+ else if (type == wxEVT_SCI_AUTOCOMP_SELECTION) txt << _T("wxEVT_SCI_AUTOCOMP_SELECTION");
+ else if (type == wxEVT_SCI_INDICATOR_CLICK) txt << _T("wxEVT_SCI_INDICATOR_CLICK");
+ else if (type == wxEVT_SCI_INDICATOR_RELEASE) txt << _T("wxEVT_SCI_INDICATOR_RELEASE");
+
+ wxLogMessage(wxT("%s take %ld ms"), txt.wx_str(), sw.Time());
+ }
+
}
}
Index: sdk/manager.cpp
===================================================================
--- sdk/manager.cpp (revision 9090)
+++ sdk/manager.cpp (working copy)
@@ -37,6 +37,9 @@
#include <wx/toolbar.h>
#include <wx/fs_mem.h>
+#include <cxxabi.h>
+#include <cstdlib>
+
#include "cbcolourmanager.h"
#include "debuggermanager.h"
@@ -177,7 +180,89 @@
if (mit != m_EventSinks.end())
{
for (EventSinksArray::iterator it = mit->second.begin(); it != mit->second.end(); ++it)
+ {
+ wxStopWatch sw;
+
(*it)->Call(event);
+
+ if(sw.Time() > 10) // only print a handler run longer than 10 ms
+ {
+ const char *p = (*it)->GetTypeName();
+ int status;
+ char *realname;
+ realname = abi::__cxa_demangle(p, 0, 0, &status);
+ wxString msg;
+ if (realname != 0)
+ {
+ msg = wxString::FromUTF8(realname);
+ free(realname);
+ }
+ else
+ msg = wxString::FromUTF8(p);
+
+ wxEventType type=event.GetEventType();
+ if(type==cbEVT_APP_STARTUP_DONE) msg.Append(_("cbEVT_APP_STARTUP_DONE"));
+ else if(type==cbEVT_APP_START_SHUTDOWN) msg.Append(_("cbEVT_APP_START_SHUTDOWN"));
+ else if(type==cbEVT_APP_ACTIVATED) msg.Append(_("cbEVT_APP_ACTIVATED"));
+ else if(type==cbEVT_APP_DEACTIVATED) msg.Append(_("cbEVT_APP_DEACTIVATED"));
+ else if(type==cbEVT_PLUGIN_ATTACHED) msg.Append(_("cbEVT_PLUGIN_ATTACHED"));
+ else if(type==cbEVT_PLUGIN_RELEASED) msg.Append(_("cbEVT_PLUGIN_RELEASED"));
+ else if(type==cbEVT_PLUGIN_INSTALLED) msg.Append(_("cbEVT_PLUGIN_INSTALLED"));
+ else if(type==cbEVT_PLUGIN_UNINSTALLED) msg.Append(_("cbEVT_PLUGIN_UNINSTALLED"));
+ else if(type==cbEVT_PLUGIN_LOADING_COMPLETE) msg.Append(_("cbEVT_PLUGIN_LOADING_COMPLETE"));
+ else if(type==cbEVT_EDITOR_CLOSE) msg.Append(_("cbEVT_EDITOR_CLOSE"));
+ else if(type==cbEVT_EDITOR_OPEN) msg.Append(_("cbEVT_EDITOR_OPEN"));
+ else if(type==cbEVT_EDITOR_SWITCHED) msg.Append(_("cbEVT_EDITOR_SWITCHED"));
+ else if(type==cbEVT_EDITOR_ACTIVATED) msg.Append(_("cbEVT_EDITOR_ACTIVATED"));
+ else if(type==cbEVT_EDITOR_DEACTIVATED) msg.Append(_("cbEVT_EDITOR_DEACTIVATED"));
+ else if(type==cbEVT_EDITOR_BEFORE_SAVE) msg.Append(_("cbEVT_EDITOR_BEFORE_SAVE"));
+ else if(type==cbEVT_EDITOR_SAVE) msg.Append(_("cbEVT_EDITOR_SAVE"));
+ else if(type==cbEVT_EDITOR_MODIFIED) msg.Append(_("cbEVT_EDITOR_MODIFIED"));
+ else if(type==cbEVT_EDITOR_TOOLTIP) msg.Append(_("cbEVT_EDITOR_TOOLTIP"));
+ else if(type==cbEVT_EDITOR_TOOLTIP_CANCEL) msg.Append(_("cbEVT_EDITOR_TOOLTIP_CANCEL"));
+ else if(type==cbEVT_EDITOR_UPDATE_UI) msg.Append(_("cbEVT_EDITOR_UPDATE_UI"));
+ else if(type==cbEVT_PROJECT_NEW) msg.Append(_("cbEVT_PROJECT_NEW"));
+ else if(type==cbEVT_PROJECT_CLOSE) msg.Append(_("cbEVT_PROJECT_CLOSE"));
+ else if(type==cbEVT_PROJECT_OPEN) msg.Append(_("cbEVT_PROJECT_OPEN"));
+ else if(type==cbEVT_PROJECT_SAVE) msg.Append(_("cbEVT_PROJECT_SAVE"));
+ else if(type==cbEVT_PROJECT_ACTIVATE) msg.Append(_("cbEVT_PROJECT_ACTIVATE"));
+ else if(type==cbEVT_PROJECT_BEGIN_ADD_FILES) msg.Append(_("cbEVT_PROJECT_BEGIN_ADD_FILES"));
+ else if(type==cbEVT_PROJECT_END_ADD_FILES) msg.Append(_("cbEVT_PROJECT_END_ADD_FILES"));
+ else if(type==cbEVT_PROJECT_BEGIN_REMOVE_FILES) msg.Append(_("cbEVT_PROJECT_BEGIN_REMOVE_FILES"));
+ else if(type==cbEVT_PROJECT_END_REMOVE_FILES) msg.Append(_("cbEVT_PROJECT_END_REMOVE_FILES"));
+ else if(type==cbEVT_PROJECT_FILE_ADDED) msg.Append(_("cbEVT_PROJECT_FILE_ADDED"));
+ else if(type==cbEVT_PROJECT_FILE_REMOVED) msg.Append(_("cbEVT_PROJECT_FILE_REMOVED"));
+ else if(type==cbEVT_PROJECT_POPUP_MENU) msg.Append(_("cbEVT_PROJECT_POPUP_MENU"));
+ else if(type==cbEVT_PROJECT_TARGETS_MODIFIED) msg.Append(_("cbEVT_PROJECT_TARGETS_MODIFIED"));
+ else if(type==cbEVT_PROJECT_RENAMED) msg.Append(_("cbEVT_PROJECT_RENAMED"));
+ else if(type==cbEVT_WORKSPACE_CHANGED) msg.Append(_("cbEVT_WORKSPACE_CHANGED"));
+ else if(type==cbEVT_BUILDTARGET_ADDED) msg.Append(_("cbEVT_BUILDTARGET_ADDED"));
+ else if(type==cbEVT_BUILDTARGET_REMOVED) msg.Append(_("cbEVT_BUILDTARGET_REMOVED"));
+ else if(type==cbEVT_BUILDTARGET_RENAMED) msg.Append(_("cbEVT_BUILDTARGET_RENAMED"));
+ else if(type==cbEVT_BUILDTARGET_SELECTED) msg.Append(_("cbEVT_BUILDTARGET_SELECTED"));
+ else if(type==cbEVT_PIPEDPROCESS_STDOUT) msg.Append(_("cbEVT_PIPEDPROCESS_STDOUT"));
+ else if(type==cbEVT_PIPEDPROCESS_STDERR) msg.Append(_("cbEVT_PIPEDPROCESS_STDERR"));
+ else if(type==cbEVT_PIPEDPROCESS_TERMINATED) msg.Append(_("cbEVT_PIPEDPROCESS_TERMINATED"));
+ else if(type==cbEVT_THREADTASK_STARTED) msg.Append(_("cbEVT_THREADTASK_STARTED"));
+ else if(type==cbEVT_THREADTASK_ENDED) msg.Append(_("cbEVT_THREADTASK_ENDED"));
+ else if(type==cbEVT_THREADTASK_ALLDONE) msg.Append(_("cbEVT_THREADTASK_ALLDONE"));
+ else if(type==cbEVT_MENUBAR_CREATE_BEGIN) msg.Append(_("cbEVT_MENUBAR_CREATE_BEGIN"));
+ else if(type==cbEVT_MENUBAR_CREATE_END) msg.Append(_("cbEVT_MENUBAR_CREATE_END"));
+ else if(type==cbEVT_COMPILER_STARTED) msg.Append(_("cbEVT_COMPILER_STARTED"));
+ else if(type==cbEVT_COMPILER_FINISHED) msg.Append(_("cbEVT_COMPILER_FINISHED"));
+ else if(type==cbEVT_COMPILER_SET_BUILD_OPTIONS) msg.Append(_("cbEVT_COMPILER_SET_BUILD_OPTIONS"));
+ else if(type==cbEVT_CLEAN_PROJECT_STARTED) msg.Append(_("cbEVT_CLEAN_PROJECT_STARTED"));
+ else if(type==cbEVT_CLEAN_WORKSPACE_STARTED) msg.Append(_("cbEVT_CLEAN_WORKSPACE_STARTED"));
+ else if(type==cbEVT_DEBUGGER_STARTED) msg.Append(_("cbEVT_DEBUGGER_STARTED"));
+ else if(type==cbEVT_DEBUGGER_STARTED) msg.Append(_("cbEVT_DEBUGGER_STARTED"));
+ else if(type==cbEVT_DEBUGGER_PAUSED) msg.Append(_("cbEVT_DEBUGGER_PAUSED"));
+ else if(type==cbEVT_DEBUGGER_FINISHED) msg.Append(_("cbEVT_DEBUGGER_FINISHED"));
+ else msg.Append(_("unknown CodeBlocksEvent"));
+
+ wxLogMessage(wxT("%s take %ld ms"), msg.wx_str(), sw.Time());
+
+ }
+ }
}
return true;
}
Index: src/main.cpp
===================================================================
--- src/main.cpp (revision 9090)
+++ src/main.cpp (working copy)
@@ -557,6 +557,7 @@
m_pScriptConsole(0),
m_pBatchBuildDialog(0)
{
+ wxLog::SetActiveTarget(new wxLogStderr());
Manager::Get(this); // provide manager with handle to MainFrame (this)
// register event sinks