aboutsummaryrefslogtreecommitdiff
path: root/src/armnnUtils/LeakChecking.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/armnnUtils/LeakChecking.hpp')
-rw-r--r--src/armnnUtils/LeakChecking.hpp89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/armnnUtils/LeakChecking.hpp b/src/armnnUtils/LeakChecking.hpp
new file mode 100644
index 0000000000..b65befe940
--- /dev/null
+++ b/src/armnnUtils/LeakChecking.hpp
@@ -0,0 +1,89 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// See LICENSE file in the project root for full license information.
+//
+#pragma once
+
+#ifdef ARMNN_LEAK_CHECKING_ENABLED
+
+#include <string>
+#include <cstddef>
+#include <memory>
+
+namespace armnnUtils
+{
+
+class ScopedLeakChecker final
+{
+public:
+ ScopedLeakChecker(const std::string & name);
+ ~ScopedLeakChecker();
+
+ // forwarding these to Google Performance Tools
+ static bool IsActive();
+ bool NoLeaks();
+ // Note that the following two functions only work after
+ // NoLeaks() has been called. See explanations in
+ // heap-checker.h
+ ssize_t BytesLeaked() const;
+ ssize_t ObjectsLeaked() const;
+
+private:
+ // hide imlementation so we don't litter other's namespaces
+ // with heap checker related stuff
+ struct Impl;
+ std::unique_ptr<Impl> m_Impl;
+
+ // No default construction and copying
+ ScopedLeakChecker() = delete;
+ ScopedLeakChecker(const ScopedLeakChecker &) = delete;
+ ScopedLeakChecker & operator=(const ScopedLeakChecker &) = delete;
+};
+
+class ScopedDisableLeakChecking final
+{
+public:
+ ScopedDisableLeakChecking();
+ ~ScopedDisableLeakChecking();
+
+private:
+ // hide imlementation so we don't litter other's namespaces
+ // with heap checker related stuff
+ struct Impl;
+ std::unique_ptr<Impl> m_Impl;
+
+ // No copying
+ ScopedDisableLeakChecking(const ScopedDisableLeakChecking &) = delete;
+ ScopedDisableLeakChecking & operator=(const ScopedDisableLeakChecking &) = delete;
+};
+
+} // namespace armnnUtils
+
+#define ARMNN_SCOPED_LEAK_CHECKER(TAG) \
+ armnnUtils::ScopedLeakChecker __scoped_armnn_leak_checker__(TAG)
+
+#define ARMNN_LEAK_CHECKER_IS_ACTIVE() \
+ armnnUtils::ScopedLeakChecker::IsActive()
+
+#define ARMNN_NO_LEAKS_IN_SCOPE() \
+ __scoped_armnn_leak_checker__.NoLeaks()
+
+#define ARMNN_BYTES_LEAKED_IN_SCOPE() \
+ __scoped_armnn_leak_checker__.BytesLeaked()
+
+#define ARMNN_OBJECTS_LEAKED_IN_SCOPE() \
+ __scoped_armnn_leak_checker__.ObjectsLeaked()
+
+#define ARMNN_DISABLE_LEAK_CHECKING_IN_SCOPE() \
+ armnnUtils::ScopedDisableLeakChecking __disable_leak_checking_in_scope__
+
+#else // ARMNN_LEAK_CHECKING_ENABLED
+
+#define ARMNN_SCOPED_LEAK_CHECKER(TAG)
+#define ARMNN_LEAK_CHECKER_IS_ACTIVE() false
+#define ARMNN_NO_LEAKS_IN_SCOPE() true
+#define ARMNN_BYTES_LEAKED_IN_SCOPE() 0
+#define ARMNN_OBJECTS_LEAKED_IN_SCOPE() 0
+#define ARMNN_DISABLE_LEAK_CHECKING_IN_SCOPE()
+
+#endif // ARMNN_LEAK_CHECKING_ENABLED