summaryrefslogtreecommitdiffstats
path: root/comphelper/source/misc/profilezone.cxx
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--comphelper/source/misc/profilezone.cxx113
1 files changed, 113 insertions, 0 deletions
diff --git a/comphelper/source/misc/profilezone.cxx b/comphelper/source/misc/profilezone.cxx
new file mode 100644
index 000000000..5abcca8a8
--- /dev/null
+++ b/comphelper/source/misc/profilezone.cxx
@@ -0,0 +1,113 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <sal/config.h>
+
+#include <atomic>
+#include <iostream>
+
+#include <comphelper/sequence.hxx>
+#include <comphelper/profilezone.hxx>
+#include <osl/time.h>
+#include <osl/thread.h>
+
+namespace comphelper
+{
+
+std::atomic<bool> ProfileZone::g_bRecording(false);
+
+namespace ProfileRecording
+{
+
+static std::vector<OUString> g_aRecording; // recorded data
+static long long g_aSumTime(0); // overall zone time in microsec
+static int g_aNesting; // level of overlapped zones
+static long long g_aStartTime; // start time of recording
+static ::osl::Mutex g_aMutex;
+
+void startRecording(bool bStartRecording)
+{
+ if (bStartRecording)
+ {
+ TimeValue systemTime;
+ osl_getSystemTime( &systemTime );
+ ::osl::MutexGuard aGuard( g_aMutex );
+ g_aStartTime = static_cast<long long>(systemTime.Seconds) * 1000000 + systemTime.Nanosec/1000;
+ g_aNesting = 0;
+ }
+ ProfileZone::g_bRecording = bStartRecording;
+}
+
+long long addRecording(const char * aProfileId, long long aCreateTime)
+{
+ assert( ProfileZone::g_bRecording );
+
+ TimeValue systemTime;
+ osl_getSystemTime( &systemTime );
+ long long aTime = static_cast<long long>(systemTime.Seconds) * 1000000 + systemTime.Nanosec/1000;
+
+ if (!aProfileId)
+ aProfileId = "(null)";
+ OUString aString(aProfileId, strlen(aProfileId), RTL_TEXTENCODING_UTF8);
+
+ OUString sRecordingData(OUString::number(osl_getThreadIdentifier(nullptr)) + " " +
+ OUString::number(aTime/1000000.0) + " " + aString + ": " +
+ (aCreateTime == 0 ? OUStringLiteral("start") : OUStringLiteral("stop")) +
+ (aCreateTime != 0 ? (" " + OUString::number((aTime - aCreateTime)/1000.0) + " ms") : OUString("")));
+
+ ::osl::MutexGuard aGuard( g_aMutex );
+
+ g_aRecording.emplace_back(sRecordingData);
+ if (aCreateTime == 0)
+ {
+ g_aNesting++;
+ return aTime;
+ }
+ // neglect ProfileZones created before startRecording
+ else if (aCreateTime >= g_aStartTime)
+ {
+ if (g_aNesting > 0)
+ g_aNesting--;
+ if (g_aNesting == 0)
+ g_aSumTime += aTime - aCreateTime;
+ }
+ return 0;
+}
+
+css::uno::Sequence<OUString> getRecordingAndClear()
+{
+ bool bRecording;
+ std::vector<OUString> aRecording;
+ {
+ ::osl::MutexGuard aGuard( g_aMutex );
+ bRecording = ProfileZone::g_bRecording;
+ startRecording(false);
+ aRecording.swap(g_aRecording);
+ long long aSumTime = g_aSumTime;
+ aRecording.insert(aRecording.begin(), OUString::number(aSumTime/1000000.0));
+ }
+ // reset start time and nesting level
+ startRecording(bRecording);
+ return ::comphelper::containerToSequence(aRecording);
+}
+
+} // namespace ProfileRecording
+
+void ProfileZone::startConsole() { m_aCreateTime = osl_getGlobalTimer(); }
+
+void ProfileZone::stopConsole()
+{
+ sal_uInt32 nEndTime = osl_getGlobalTimer();
+ std::cerr << "comphelper::ProfileZone: " << m_sProfileId << " finished in "
+ << nEndTime - m_aCreateTime << " ms" << std::endl;
+}
+
+} // namespace comphelper
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */