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