summaryrefslogtreecommitdiffstats
path: root/include/comphelper/profilezone.hxx
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--include/comphelper/profilezone.hxx92
1 files changed, 92 insertions, 0 deletions
diff --git a/include/comphelper/profilezone.hxx b/include/comphelper/profilezone.hxx
new file mode 100644
index 000000000..71f9fa30b
--- /dev/null
+++ b/include/comphelper/profilezone.hxx
@@ -0,0 +1,92 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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/.
+*/
+
+#ifndef INCLUDED_COMPHELPER_PROFILEZONE_HXX
+#define INCLUDED_COMPHELPER_PROFILEZONE_HXX
+
+#include <sal/config.h>
+
+#include <sal/log.hxx>
+
+#include <comphelper/traceevent.hxx>
+
+// implementation of XToolkitExperimental profiling API
+
+namespace comphelper
+{
+class COMPHELPER_DLLPUBLIC ProfileZone : public NamedEvent
+{
+ long long m_nCreateTime;
+ int m_nNesting;
+
+ void addRecording();
+
+ static void setNestingLevel(int nNestingLevel);
+ static int getNestingLevel();
+
+ ProfileZone(const char* sName, const OUString& sArgs)
+ : NamedEvent(sName, sArgs)
+ , m_nNesting(-1)
+ {
+ if (s_bRecording)
+ {
+ m_nCreateTime = getNow();
+
+ m_nNesting = getNestingLevel();
+ setNestingLevel(getNestingLevel() + 1);
+ }
+ else
+ m_nCreateTime = 0;
+ }
+
+public:
+ /**
+ * Starts measuring the cost of a C++ scope.
+ *
+ * Note that the char pointer is stored as such in the ProfileZone object and used in the
+ * destructor, so be sure to pass a pointer that stays valid for the duration of the object's
+ * lifetime.
+ */
+ ProfileZone(const char* sName, const std::map<OUString, OUString>& aArgs)
+ : ProfileZone(sName, createArgsString(aArgs))
+ {
+ }
+
+ ProfileZone(const char* sName)
+ : ProfileZone(sName, OUString())
+ {
+ }
+
+ ~ProfileZone()
+ {
+ if (m_nCreateTime > 0)
+ {
+ setNestingLevel(getNestingLevel() - 1);
+
+ if (m_nNesting != getNestingLevel())
+ {
+ SAL_WARN("comphelper.traceevent", "Incorrect ProfileZone nesting for " << m_sName);
+ }
+ else
+ {
+ if (s_bRecording)
+ addRecording();
+ }
+ }
+ }
+
+ ProfileZone(const ProfileZone&) = delete;
+ void operator=(const ProfileZone&) = delete;
+};
+
+} // namespace comphelper
+
+#endif // INCLUDED_COMPHELPER_PROFILEZONE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */