xref: /aosp_15_r20/external/armnn/src/armnnUtils/LeakChecking.cpp (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 
6*89c4ff92SAndroid Build Coastguard Worker #ifdef ARMNN_LEAK_CHECKING_ENABLED
7*89c4ff92SAndroid Build Coastguard Worker 
8*89c4ff92SAndroid Build Coastguard Worker #include "LeakChecking.hpp"
9*89c4ff92SAndroid Build Coastguard Worker #include "gperftools/heap-checker.h"
10*89c4ff92SAndroid Build Coastguard Worker 
11*89c4ff92SAndroid Build Coastguard Worker namespace armnnUtils
12*89c4ff92SAndroid Build Coastguard Worker {
13*89c4ff92SAndroid Build Coastguard Worker 
14*89c4ff92SAndroid Build Coastguard Worker struct ScopedLeakChecker::Impl
15*89c4ff92SAndroid Build Coastguard Worker {
16*89c4ff92SAndroid Build Coastguard Worker     HeapLeakChecker m_LeakChecker;
17*89c4ff92SAndroid Build Coastguard Worker 
ImplarmnnUtils::ScopedLeakChecker::Impl18*89c4ff92SAndroid Build Coastguard Worker     Impl(const std::string & name)
19*89c4ff92SAndroid Build Coastguard Worker     : m_LeakChecker(name.c_str())
20*89c4ff92SAndroid Build Coastguard Worker     {
21*89c4ff92SAndroid Build Coastguard Worker     }
22*89c4ff92SAndroid Build Coastguard Worker };
23*89c4ff92SAndroid Build Coastguard Worker 
ScopedLeakChecker(const std::string & name)24*89c4ff92SAndroid Build Coastguard Worker ScopedLeakChecker::ScopedLeakChecker(const std::string & name)
25*89c4ff92SAndroid Build Coastguard Worker : m_Impl(new Impl(name))
26*89c4ff92SAndroid Build Coastguard Worker {
27*89c4ff92SAndroid Build Coastguard Worker }
28*89c4ff92SAndroid Build Coastguard Worker 
~ScopedLeakChecker()29*89c4ff92SAndroid Build Coastguard Worker ScopedLeakChecker::~ScopedLeakChecker() {}
30*89c4ff92SAndroid Build Coastguard Worker 
IsActive()31*89c4ff92SAndroid Build Coastguard Worker bool ScopedLeakChecker::IsActive()
32*89c4ff92SAndroid Build Coastguard Worker {
33*89c4ff92SAndroid Build Coastguard Worker     return HeapLeakChecker::IsActive();
34*89c4ff92SAndroid Build Coastguard Worker }
35*89c4ff92SAndroid Build Coastguard Worker 
NoLeaks()36*89c4ff92SAndroid Build Coastguard Worker bool ScopedLeakChecker::NoLeaks()
37*89c4ff92SAndroid Build Coastguard Worker {
38*89c4ff92SAndroid Build Coastguard Worker     return (IsActive() ? m_Impl->m_LeakChecker.NoLeaks() : true);
39*89c4ff92SAndroid Build Coastguard Worker }
40*89c4ff92SAndroid Build Coastguard Worker 
BytesLeaked() const41*89c4ff92SAndroid Build Coastguard Worker ssize_t ScopedLeakChecker::BytesLeaked() const
42*89c4ff92SAndroid Build Coastguard Worker {
43*89c4ff92SAndroid Build Coastguard Worker     return (IsActive() ? m_Impl->m_LeakChecker.BytesLeaked(): 0);
44*89c4ff92SAndroid Build Coastguard Worker }
45*89c4ff92SAndroid Build Coastguard Worker 
ObjectsLeaked() const46*89c4ff92SAndroid Build Coastguard Worker ssize_t ScopedLeakChecker::ObjectsLeaked() const
47*89c4ff92SAndroid Build Coastguard Worker {
48*89c4ff92SAndroid Build Coastguard Worker     return (IsActive() ? m_Impl->m_LeakChecker.ObjectsLeaked(): 0 );
49*89c4ff92SAndroid Build Coastguard Worker }
50*89c4ff92SAndroid Build Coastguard Worker 
51*89c4ff92SAndroid Build Coastguard Worker struct ScopedDisableLeakChecking::Impl
52*89c4ff92SAndroid Build Coastguard Worker {
53*89c4ff92SAndroid Build Coastguard Worker     HeapLeakChecker::Disabler m_Disabler;
54*89c4ff92SAndroid Build Coastguard Worker };
55*89c4ff92SAndroid Build Coastguard Worker 
ScopedDisableLeakChecking()56*89c4ff92SAndroid Build Coastguard Worker ScopedDisableLeakChecking::ScopedDisableLeakChecking()
57*89c4ff92SAndroid Build Coastguard Worker : m_Impl(new Impl)
58*89c4ff92SAndroid Build Coastguard Worker {
59*89c4ff92SAndroid Build Coastguard Worker }
60*89c4ff92SAndroid Build Coastguard Worker 
~ScopedDisableLeakChecking()61*89c4ff92SAndroid Build Coastguard Worker ScopedDisableLeakChecking::~ScopedDisableLeakChecking()
62*89c4ff92SAndroid Build Coastguard Worker {
63*89c4ff92SAndroid Build Coastguard Worker }
64*89c4ff92SAndroid Build Coastguard Worker 
LocalLeakCheckingOnly()65*89c4ff92SAndroid Build Coastguard Worker void LocalLeakCheckingOnly()
66*89c4ff92SAndroid Build Coastguard Worker {
67*89c4ff92SAndroid Build Coastguard Worker     auto * globalChecker = HeapLeakChecker::GlobalChecker();
68*89c4ff92SAndroid Build Coastguard Worker     if (globalChecker)
69*89c4ff92SAndroid Build Coastguard Worker     {
70*89c4ff92SAndroid Build Coastguard Worker         // Don't care about global leaks and make sure we won't report any.
71*89c4ff92SAndroid Build Coastguard Worker         // This is because leak checking supposed to run in well defined
72*89c4ff92SAndroid Build Coastguard Worker         // contexts through the ScopedLeakChecker, otherwise we risk false
73*89c4ff92SAndroid Build Coastguard Worker         // positives because of external factors.
74*89c4ff92SAndroid Build Coastguard Worker         globalChecker->NoGlobalLeaks();
75*89c4ff92SAndroid Build Coastguard Worker         globalChecker->CancelGlobalCheck();
76*89c4ff92SAndroid Build Coastguard Worker     }
77*89c4ff92SAndroid Build Coastguard Worker }
78*89c4ff92SAndroid Build Coastguard Worker 
79*89c4ff92SAndroid Build Coastguard Worker } // namespace armnnUtils
80*89c4ff92SAndroid Build Coastguard Worker 
81*89c4ff92SAndroid Build Coastguard Worker #endif // ARMNN_LEAK_CHECKING_ENABLED
82