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 WorkerScopedLeakChecker::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 WorkerScopedLeakChecker::~ScopedLeakChecker() {} 30*89c4ff92SAndroid Build Coastguard Worker IsActive()31*89c4ff92SAndroid Build Coastguard Workerbool 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 Workerbool 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 Workerssize_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 Workerssize_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 WorkerScopedDisableLeakChecking::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 WorkerScopedDisableLeakChecking::~ScopedDisableLeakChecking() 62*89c4ff92SAndroid Build Coastguard Worker { 63*89c4ff92SAndroid Build Coastguard Worker } 64*89c4ff92SAndroid Build Coastguard Worker LocalLeakCheckingOnly()65*89c4ff92SAndroid Build Coastguard Workervoid 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