Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

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