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