blob: 13d4dc35ee6b6fee01f767ab135bff7b3331f931 [file] [log] [blame]
//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
#ifdef ARMNN_LEAK_CHECKING_ENABLED
#include "LeakChecking.hpp"
#include "gperftools/heap-checker.h"
namespace armnnUtils
{
struct ScopedLeakChecker::Impl
{
HeapLeakChecker m_LeakChecker;
Impl(const std::string & name)
: m_LeakChecker(name.c_str())
{
}
};
ScopedLeakChecker::ScopedLeakChecker(const std::string & name)
: m_Impl(new Impl(name))
{
}
ScopedLeakChecker::~ScopedLeakChecker() {}
bool ScopedLeakChecker::IsActive()
{
return HeapLeakChecker::IsActive();
}
bool ScopedLeakChecker::NoLeaks()
{
return (IsActive() ? m_Impl->m_LeakChecker.NoLeaks() : true);
}
ssize_t ScopedLeakChecker::BytesLeaked() const
{
return (IsActive() ? m_Impl->m_LeakChecker.BytesLeaked(): 0);
}
ssize_t ScopedLeakChecker::ObjectsLeaked() const
{
return (IsActive() ? m_Impl->m_LeakChecker.ObjectsLeaked(): 0 );
}
struct ScopedDisableLeakChecking::Impl
{
HeapLeakChecker::Disabler m_Disabler;
};
ScopedDisableLeakChecking::ScopedDisableLeakChecking()
: m_Impl(new Impl)
{
}
ScopedDisableLeakChecking::~ScopedDisableLeakChecking()
{
}
void LocalLeakCheckingOnly()
{
auto * globalChecker = HeapLeakChecker::GlobalChecker();
if (globalChecker)
{
// Don't care about global leaks and make sure we won't report any.
// This is because leak checking supposed to run in well defined
// contexts through the ScopedLeakChecker, otherwise we risk false
// positives because of external factors.
globalChecker->NoGlobalLeaks();
globalChecker->CancelGlobalCheck();
}
}
} // namespace armnnUtils
#endif // ARMNN_LEAK_CHECKING_ENABLED