//
// Copyright © 2017 Arm Ltd. All rights reserved.
// See LICENSE file in the project root for full license information.
//

#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
