Release 18.08
[platform/upstream/armnn.git] / src / armnnUtils / LeakChecking.hpp
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // See LICENSE file in the project root for full license information.
4 //
5 #pragma once
6
7 #ifdef ARMNN_LEAK_CHECKING_ENABLED
8
9 #include <string>
10 #include <cstddef>
11 #include <memory>
12
13 namespace armnnUtils
14 {
15
16 class ScopedLeakChecker final
17 {
18 public:
19     ScopedLeakChecker(const std::string & name);
20     ~ScopedLeakChecker();
21
22     // Forwarding these to Google Performance Tools.
23     static bool IsActive();
24     bool NoLeaks();
25     // Note that the following two functions only work after
26     // NoLeaks() has been called. See explanations in
27     // heap-checker.h
28     ssize_t BytesLeaked() const;
29     ssize_t ObjectsLeaked() const;
30
31 private:
32     // Hides imlementation so we don't litter other's namespaces
33     // with heap checker related stuff.
34     struct Impl;
35     std::unique_ptr<Impl> m_Impl;
36
37     // No default construction and copying.
38     ScopedLeakChecker() = delete;
39     ScopedLeakChecker(const ScopedLeakChecker &) = delete;
40     ScopedLeakChecker & operator=(const ScopedLeakChecker &) = delete;
41 };
42
43 class ScopedDisableLeakChecking final
44 {
45 public:
46     ScopedDisableLeakChecking();
47     ~ScopedDisableLeakChecking();
48
49 private:
50     // Hides imlementation so we don't litter other's namespaces
51     // with heap checker related stuff.
52     struct Impl;
53     std::unique_ptr<Impl> m_Impl;
54
55     // No copying.
56     ScopedDisableLeakChecking(const ScopedDisableLeakChecking &) = delete;
57     ScopedDisableLeakChecking & operator=(const ScopedDisableLeakChecking &) = delete;
58 };
59
60 // disable global leak checks starting from 'main'
61 void LocalLeakCheckingOnly();
62
63 } // namespace armnnUtils
64
65 #define ARMNN_SCOPED_LEAK_CHECKER(TAG) \
66     armnnUtils::ScopedLeakChecker __scoped_armnn_leak_checker__(TAG)
67
68 #define ARMNN_LEAK_CHECKER_IS_ACTIVE() \
69     armnnUtils::ScopedLeakChecker::IsActive()
70
71 #define ARMNN_NO_LEAKS_IN_SCOPE() \
72     __scoped_armnn_leak_checker__.NoLeaks()
73
74 #define ARMNN_BYTES_LEAKED_IN_SCOPE() \
75     __scoped_armnn_leak_checker__.BytesLeaked()
76
77 #define ARMNN_OBJECTS_LEAKED_IN_SCOPE() \
78     __scoped_armnn_leak_checker__.ObjectsLeaked()
79
80 #define ARMNN_DISABLE_LEAK_CHECKING_IN_SCOPE() \
81     armnnUtils::ScopedDisableLeakChecking __disable_leak_checking_in_scope__
82
83 #define ARMNN_LOCAL_LEAK_CHECKING_ONLY() \
84     armnnUtils::LocalLeakCheckingOnly()
85
86 #else // ARMNN_LEAK_CHECKING_ENABLED
87
88 #define ARMNN_SCOPED_LEAK_CHECKER(TAG)
89 #define ARMNN_LEAK_CHECKER_IS_ACTIVE() false
90 #define ARMNN_NO_LEAKS_IN_SCOPE() true
91 #define ARMNN_BYTES_LEAKED_IN_SCOPE() 0
92 #define ARMNN_OBJECTS_LEAKED_IN_SCOPE() 0
93 #define ARMNN_DISABLE_LEAK_CHECKING_IN_SCOPE()
94 #define ARMNN_LOCAL_LEAK_CHECKING_ONLY()
95
96 #endif // ARMNN_LEAK_CHECKING_ENABLED