/* Copyright (c) 2019 Microsoft Corporation. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Author: Leonardo de Moura */ #include namespace lean { allocprof::allocprof(std::ostream & out, char const * msg): m_out(out), m_msg(msg) { #ifdef LEAN_RUNTIME_STATS m_num_ctor = g_num_ctor; m_num_closure = g_num_closure; m_num_string = g_num_string; m_num_array = g_num_array; m_num_thunk = g_num_thunk; m_num_task = g_num_task; m_num_ext = g_num_ext; #endif } allocprof::~allocprof() { m_out << m_msg << "\n"; #ifdef LEAN_RUNTIME_STATS uint64 num_ctor = g_num_ctor - m_num_ctor; uint64 num_closure = g_num_closure - m_num_closure; uint64 num_string = g_num_string - m_num_string; uint64 num_array = g_num_array - m_num_array; uint64 num_thunk = g_num_thunk - m_num_thunk; uint64 num_task = g_num_task - m_num_task; uint64 num_ext = g_num_ext - m_num_ext; if (num_ctor > 0) m_out << "num. constructor: " << num_ctor << "\n"; if (num_closure > 0) m_out << "num. closure: " << num_closure << "\n"; if (num_string > 0) m_out << "num. string: " << num_string << "\n"; if (num_array > 0) m_out << "num. array: " << num_array << "\n"; if (num_thunk > 0) m_out << "num. thunk: " << num_thunk << "\n"; if (num_task > 0) m_out << "num. task: " << num_task << "\n"; if (num_ext > 0) m_out << "num. external: " << num_ext << "\n"; if (num_ctor == 0 && num_closure == 0 && num_string == 0 && num_array == 0 && num_thunk == 0 && num_task == 0 && num_ext == 0) { m_out << "***no runtime object allocation has occurred**\n"; } m_out << "-------------\n"; #else m_out << "Allocation profiling data is not available, compile lean using `-D RUNTIME_STATS=ON`\n"; #endif } }