libstdc++
profiler_list_to_slist.h
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Copyright (C) 2009-2017 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_list_to_slist.h
25  * @brief Diagnostics for list to slist.
26  */
27 
28 // Written by Changhee Jung.
29 
30 #ifndef _GLIBCXX_PROFILE_PROFILER_LIST_TO_SLIST_H
31 #define _GLIBCXX_PROFILE_PROFILER_LIST_TO_SLIST_H 1
32 
33 #include "profile/impl/profiler.h"
36 
37 namespace __gnu_profile
38 {
39  class __list2slist_info
40  : public __object_info_base
41  {
42  public:
43  __list2slist_info(__stack_t __stack)
44  : __object_info_base(__stack), _M_rewind(false), _M_operations(0) { }
45 
46  // XXX: the magnitude should be multiplied with a constant factor F,
47  // where F is 1 when the malloc size class of list nodes is different
48  // from the malloc size class of slist nodes. When they fall into the same
49  // class, the only slist benefit is from having to set fewer links, so
50  // the factor F should be much smaller, closer to 0 than to 1.
51  // This could be implemented by passing the size classes in the config
52  // file. For now, we always assume F to be 1.
53 
54  float
55  __magnitude() const
56  {
57  if (!_M_rewind)
58  return _M_operations;
59  else
60  return 0;
61  }
62 
63  void
64  __write(FILE* __f) const
65  { std::fprintf(__f, "%s\n", _M_rewind ? "invalid" : "valid"); }
66 
68  __advice() const
69  { return "change std::list to std::forward_list"; }
70 
71  void
72  __opr_rewind()
73  {
74  _M_rewind = true;
75  __set_invalid();
76  }
77 
78  void
79  __record_operation()
80  { ++_M_operations; }
81 
82  bool
83  __has_rewind()
84  { return _M_rewind; }
85 
86  private:
87  bool _M_rewind;
88  std::size_t _M_operations;
89  };
90 
91  class __list2slist_stack_info
92  : public __list2slist_info
93  {
94  public:
95  __list2slist_stack_info(const __list2slist_info& __o)
96  : __list2slist_info(__o) { }
97  };
98 
99  class __trace_list_to_slist
100  : public __trace_base<__list2slist_info, __list2slist_stack_info>
101  {
102  public:
103  ~__trace_list_to_slist() { }
104 
105  __trace_list_to_slist()
106  : __trace_base<__list2slist_info, __list2slist_stack_info>()
107  { __id = "list-to-slist"; }
108 
109  void
110  __destruct(__list2slist_info* __obj_info)
111  { __retire_object(__obj_info); }
112  };
113 
114 
115  inline void
116  __trace_list_to_slist_init()
117  { _GLIBCXX_PROFILE_DATA(_S_list_to_slist) = new __trace_list_to_slist(); }
118 
119  inline void
120  __trace_list_to_slist_free()
121  { delete _GLIBCXX_PROFILE_DATA(_S_list_to_slist); }
122 
123  inline void
124  __trace_list_to_slist_report(FILE* __f, __warning_vector_t& __warnings)
125  { __trace_report(_GLIBCXX_PROFILE_DATA(_S_list_to_slist), __f, __warnings); }
126 
127  inline __list2slist_info*
128  __trace_list_to_slist_construct()
129  {
130  if (!__profcxx_init())
131  return 0;
132 
133  if (!__reentrance_guard::__get_in())
134  return 0;
135 
136  __reentrance_guard __get_out;
137  return _GLIBCXX_PROFILE_DATA(_S_list_to_slist)->__add_object(__get_stack());
138  }
139 
140  inline void
141  __trace_list_to_slist_rewind(__list2slist_info* __obj_info)
142  {
143  if (!__obj_info)
144  return;
145 
146  __obj_info->__opr_rewind();
147  }
148 
149  inline void
150  __trace_list_to_slist_operation(__list2slist_info* __obj_info)
151  {
152  if (!__obj_info)
153  return;
154 
155  __obj_info->__record_operation();
156  }
157 
158  inline void
159  __trace_list_to_slist_destruct(__list2slist_info* __obj_info)
160  {
161  if (!__obj_info)
162  return;
163 
164  _GLIBCXX_PROFILE_DATA(_S_list_to_slist)->__destruct(__obj_info);
165  }
166 
167 } // namespace __gnu_profile
168 #endif /* _GLIBCXX_PROFILE_PROFILER_LIST_TO_SLIST_H */
Data structures to represent profiling traces.
Interface of the profiling runtime library.
Data structures to represent a single profiling event.
bool __profcxx_init()
This function must be called by each instrumentation point.
GNU profile code for public use.