diff options
-rw-r--r-- | desktop/source/lib/init.cxx | 36 | ||||
-rw-r--r-- | include/LibreOfficeKit/LibreOfficeKitEnums.h | 6 | ||||
-rw-r--r-- | libreofficekit/source/gtk/lokdocview.cxx | 2 |
3 files changed, 44 insertions, 0 deletions
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 279232e07c99..e6feceb595b2 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -50,6 +50,7 @@ #include <comphelper/lok.hxx> #include <comphelper/processfactory.hxx> #include <comphelper/string.hxx> +#include <comphelper/profilezone.hxx> #include <comphelper/propertysequence.hxx> #include <comphelper/scopeguard.hxx> #include <comphelper/threadpool.hxx> @@ -4495,6 +4496,31 @@ static void preloadData() rtl::Bootstrap::set("UserInstallation", sUserPath); } +class ProfileZoneDumper : public AutoTimer +{ + static const int dumpTimeoutMS = 5000; +public: + ProfileZoneDumper() : AutoTimer( "zone dumper" ) + { + SetTimeout(dumpTimeoutMS); + Start(); + } + virtual void Invoke() override + { + css::uno::Sequence<OUString> aEvents = + comphelper::ProfileRecording::getRecordingAndClear(); + OStringBuffer aOutput; + for (auto &s : aEvents) + { + aOutput.append(OUStringToOString(s, RTL_TEXTENCODING_UTF8)); + aOutput.append("\n"); + } + OString aChunk = aOutput.makeStringAndClear(); + if (gImpl && gImpl->mpCallback) + gImpl->mpCallback(LOK_CALLBACK_PROFILE_FRAME, aChunk.getStr(), gImpl->mpCallbackData); + } +}; + static int lo_initialize(LibreOfficeKit* pThis, const char* pAppPath, const char* pUserProfileUrl) { enum { @@ -4505,6 +4531,7 @@ static int lo_initialize(LibreOfficeKit* pThis, const char* pAppPath, const char // Did we do a pre-initialize static bool bPreInited = false; + static bool bProfileZones = getenv("SAL_PROFILEZONE_STDOUT") != nullptr; // What stage are we at ? if (pThis == nullptr) @@ -4519,6 +4546,15 @@ static int lo_initialize(LibreOfficeKit* pThis, const char* pAppPath, const char if (bInitialized) return 1; + // Turn profile zones on early + if (bProfileZones && eStage == SECOND_INIT) + { + comphelper::ProfileRecording::startRecording(true); + new ProfileZoneDumper(); + } + + comphelper::ProfileZone aZone("lok-init"); + if (eStage == PRE_INIT) rtl_alloc_preInit(true); else if (eStage == SECOND_INIT) diff --git a/include/LibreOfficeKit/LibreOfficeKitEnums.h b/include/LibreOfficeKit/LibreOfficeKitEnums.h index 1d55ce8583b3..ef24828988f7 100644 --- a/include/LibreOfficeKit/LibreOfficeKitEnums.h +++ b/include/LibreOfficeKit/LibreOfficeKitEnums.h @@ -610,6 +610,12 @@ typedef enum * On-load notification of the document signature status. */ LOK_CALLBACK_SIGNATURE_STATUS = 40, + + /** + * Profiling tracing information single string of multiple lines + * containing <pid> <timestamp> and zone start/stop information + */ + LOK_CALLBACK_PROFILE_FRAME = 41 } LibreOfficeKitCallbackType; diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx index 1221b056c2a3..36601e385173 100644 --- a/libreofficekit/source/gtk/lokdocview.cxx +++ b/libreofficekit/source/gtk/lokdocview.cxx @@ -448,6 +448,8 @@ callbackTypeToString (int nType) return "LOK_CALLBACK_CONTEXT_CHANGED"; case LOK_CALLBACK_SIGNATURE_STATUS: return "LOK_CALLBACK_SIGNATURE_STATUS"; + case LOK_CALLBACK_PROFILE_FRAME: + return "LOK_CALLBACK_PROFILE_FRAME"; } g_assert(false); return nullptr; |