1*38fd1498Szrj // -*- C++ -*- 2*38fd1498Szrj // 3*38fd1498Szrj // Copyright (C) 2009-2018 Free Software Foundation, Inc. 4*38fd1498Szrj // 5*38fd1498Szrj // This file is part of the GNU ISO C++ Library. This library is free 6*38fd1498Szrj // software; you can redistribute it and/or modify it under the 7*38fd1498Szrj // terms of the GNU General Public License as published by the 8*38fd1498Szrj // Free Software Foundation; either version 3, or (at your option) 9*38fd1498Szrj // any later version. 10*38fd1498Szrj // 11*38fd1498Szrj // This library is distributed in the hope that it will be useful, 12*38fd1498Szrj // but WITHOUT ANY WARRANTY; without even the implied warranty of 13*38fd1498Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*38fd1498Szrj // GNU General Public License for more details. 15*38fd1498Szrj 16*38fd1498Szrj // Under Section 7 of GPL version 3, you are granted additional 17*38fd1498Szrj // permissions described in the GCC Runtime Library Exception, version 18*38fd1498Szrj // 3.1, as published by the Free Software Foundation. 19*38fd1498Szrj 20*38fd1498Szrj // You should have received a copy of the GNU General Public License along 21*38fd1498Szrj // with this library; see the file COPYING3. If not see 22*38fd1498Szrj // <http://www.gnu.org/licenses/>. 23*38fd1498Szrj 24*38fd1498Szrj /** @file profile/impl/profiler_hash_func.h 25*38fd1498Szrj * @brief Data structures to represent profiling traces. 26*38fd1498Szrj */ 27*38fd1498Szrj 28*38fd1498Szrj // Written by Lixia Liu and Silvius Rus. 29*38fd1498Szrj 30*38fd1498Szrj #ifndef _GLIBCXX_PROFILE_PROFILER_HASH_FUNC_H 31*38fd1498Szrj #define _GLIBCXX_PROFILE_PROFILER_HASH_FUNC_H 1 32*38fd1498Szrj 33*38fd1498Szrj #include "profile/impl/profiler.h" 34*38fd1498Szrj #include "profile/impl/profiler_node.h" 35*38fd1498Szrj #include "profile/impl/profiler_trace.h" 36*38fd1498Szrj 37*38fd1498Szrj namespace __gnu_profile 38*38fd1498Szrj { 39*38fd1498Szrj /** @brief A hash performance instrumentation line in the object table. */ 40*38fd1498Szrj class __hashfunc_info 41*38fd1498Szrj : public __object_info_base 42*38fd1498Szrj { 43*38fd1498Szrj public: __hashfunc_info(__stack_t __stack)44*38fd1498Szrj __hashfunc_info(__stack_t __stack) 45*38fd1498Szrj : __object_info_base(__stack), _M_longest_chain(0), 46*38fd1498Szrj _M_accesses(0), _M_hops(0) { } 47*38fd1498Szrj 48*38fd1498Szrj void __merge(const __hashfunc_info & __o)49*38fd1498Szrj __merge(const __hashfunc_info& __o) 50*38fd1498Szrj { 51*38fd1498Szrj __object_info_base::__merge(__o); 52*38fd1498Szrj _M_longest_chain = std::max(_M_longest_chain, __o._M_longest_chain); 53*38fd1498Szrj _M_accesses += __o._M_accesses; 54*38fd1498Szrj _M_hops += __o._M_hops; 55*38fd1498Szrj } 56*38fd1498Szrj 57*38fd1498Szrj void __destruct(std::size_t __chain,std::size_t __accesses,std::size_t __hops)58*38fd1498Szrj __destruct(std::size_t __chain, std::size_t __accesses, 59*38fd1498Szrj std::size_t __hops) 60*38fd1498Szrj { 61*38fd1498Szrj _M_longest_chain = std::max(_M_longest_chain, __chain); 62*38fd1498Szrj _M_accesses += __accesses; 63*38fd1498Szrj _M_hops += __hops; 64*38fd1498Szrj } 65*38fd1498Szrj 66*38fd1498Szrj void __write(FILE * __f)67*38fd1498Szrj __write(FILE* __f) const 68*38fd1498Szrj { std::fprintf(__f, "%Zu %Zu %Zu\n", _M_hops, 69*38fd1498Szrj _M_accesses, _M_longest_chain); } 70*38fd1498Szrj 71*38fd1498Szrj float __magnitude()72*38fd1498Szrj __magnitude() const 73*38fd1498Szrj { return static_cast<float>(_M_hops); } 74*38fd1498Szrj 75*38fd1498Szrj std::string __advice()76*38fd1498Szrj __advice() const 77*38fd1498Szrj { return "change hash function"; } 78*38fd1498Szrj 79*38fd1498Szrj private: 80*38fd1498Szrj std::size_t _M_longest_chain; 81*38fd1498Szrj std::size_t _M_accesses; 82*38fd1498Szrj std::size_t _M_hops; 83*38fd1498Szrj }; 84*38fd1498Szrj 85*38fd1498Szrj /** @brief A hash performance instrumentation line in the stack table. */ 86*38fd1498Szrj class __hashfunc_stack_info 87*38fd1498Szrj : public __hashfunc_info 88*38fd1498Szrj { 89*38fd1498Szrj public: __hashfunc_stack_info(const __hashfunc_info & __o)90*38fd1498Szrj __hashfunc_stack_info(const __hashfunc_info& __o) 91*38fd1498Szrj : __hashfunc_info(__o) { } 92*38fd1498Szrj }; 93*38fd1498Szrj 94*38fd1498Szrj /** @brief Hash performance instrumentation producer. */ 95*38fd1498Szrj class __trace_hash_func 96*38fd1498Szrj : public __trace_base<__hashfunc_info, __hashfunc_stack_info> 97*38fd1498Szrj { 98*38fd1498Szrj public: __trace_hash_func()99*38fd1498Szrj __trace_hash_func() 100*38fd1498Szrj : __trace_base<__hashfunc_info, __hashfunc_stack_info>() 101*38fd1498Szrj { __id = "hash-distr"; } 102*38fd1498Szrj ~__trace_hash_func()103*38fd1498Szrj ~__trace_hash_func() {} 104*38fd1498Szrj 105*38fd1498Szrj // Call at destruction/clean to set container final size. 106*38fd1498Szrj void __destruct(__hashfunc_info * __obj_info,std::size_t __chain,std::size_t __accesses,std::size_t __hops)107*38fd1498Szrj __destruct(__hashfunc_info* __obj_info, 108*38fd1498Szrj std::size_t __chain, std::size_t __accesses, std::size_t __hops) 109*38fd1498Szrj { 110*38fd1498Szrj if (!__obj_info) 111*38fd1498Szrj return; 112*38fd1498Szrj 113*38fd1498Szrj __obj_info->__destruct(__chain, __accesses, __hops); 114*38fd1498Szrj __retire_object(__obj_info); 115*38fd1498Szrj } 116*38fd1498Szrj }; 117*38fd1498Szrj 118*38fd1498Szrj inline void __trace_hash_func_init()119*38fd1498Szrj __trace_hash_func_init() 120*38fd1498Szrj { _GLIBCXX_PROFILE_DATA(_S_hash_func) = new __trace_hash_func(); } 121*38fd1498Szrj 122*38fd1498Szrj inline void __trace_hash_func_free()123*38fd1498Szrj __trace_hash_func_free() 124*38fd1498Szrj { delete _GLIBCXX_PROFILE_DATA(_S_hash_func); } 125*38fd1498Szrj 126*38fd1498Szrj inline void __trace_hash_func_report(FILE * __f,__warning_vector_t & __warnings)127*38fd1498Szrj __trace_hash_func_report(FILE* __f, __warning_vector_t& __warnings) 128*38fd1498Szrj { __trace_report(_GLIBCXX_PROFILE_DATA(_S_hash_func), __f, __warnings); } 129*38fd1498Szrj 130*38fd1498Szrj inline __hashfunc_info* __trace_hash_func_construct()131*38fd1498Szrj __trace_hash_func_construct() 132*38fd1498Szrj { 133*38fd1498Szrj if (!__profcxx_init()) 134*38fd1498Szrj return 0; 135*38fd1498Szrj 136*38fd1498Szrj if (!__reentrance_guard::__get_in()) 137*38fd1498Szrj return 0; 138*38fd1498Szrj 139*38fd1498Szrj __reentrance_guard __get_out; 140*38fd1498Szrj return _GLIBCXX_PROFILE_DATA(_S_hash_func)->__add_object(__get_stack()); 141*38fd1498Szrj } 142*38fd1498Szrj 143*38fd1498Szrj inline void __trace_hash_func_destruct(__hashfunc_info * __obj_info,std::size_t __chain,std::size_t __accesses,std::size_t __hops)144*38fd1498Szrj __trace_hash_func_destruct(__hashfunc_info* __obj_info, 145*38fd1498Szrj std::size_t __chain, std::size_t __accesses, 146*38fd1498Szrj std::size_t __hops) 147*38fd1498Szrj { 148*38fd1498Szrj _GLIBCXX_PROFILE_DATA(_S_hash_func)->__destruct(__obj_info, __chain, 149*38fd1498Szrj __accesses, __hops); 150*38fd1498Szrj } 151*38fd1498Szrj 152*38fd1498Szrj } // namespace __gnu_profile 153*38fd1498Szrj #endif /* _GLIBCXX_PROFILE_PROFILER_HASH_FUNC_H */ 154