STLdoc
STLdocumentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Protected Attributes | Private Types | Private Attributes | List of all members
__gnu_profile::__trace_base< __object_info, __stack_info > Class Template Reference

Base class for all trace producers. More...

#include <profile/impl/profiler_trace.h>

Public Member Functions

 __trace_base ()
 
virtual ~__trace_base ()
 
void __add_object (__object_t object, __object_info __info)
 
__object_info * __get_object_info (__object_t __object)
 
void __retire_object (__object_t __object)
 
void __write (FILE *__f)
 
void __collect_warnings (__warning_vector_t &__warnings)
 

Protected Attributes

const char * __id
 

Private Types

typedef
_GLIBCXX_IMPL_UNORDERED_MAP
< __object_t, __object_info > 
__object_table_t
 
typedef
_GLIBCXX_IMPL_UNORDERED_MAP
< __stack_t, __stack_info,
__stack_hash, __stack_hash
__stack_table_t
 

Private Attributes

__gnu_cxx::__mutex __object_table_lock
 
__gnu_cxx::__mutex __stack_table_lock
 
__object_table_t __object_table
 
__stack_table_t __stack_table
 
std::size_t __stack_table_byte_size
 

Detailed Description

template<typename __object_info, typename __stack_info>
class __gnu_profile::__trace_base< __object_info, __stack_info >

Base class for all trace producers.

Member Typedef Documentation

template<typename __object_info, typename __stack_info>
typedef _GLIBCXX_IMPL_UNORDERED_MAP<__object_t, __object_info> __gnu_profile::__trace_base< __object_info, __stack_info >::__object_table_t
private
template<typename __object_info, typename __stack_info>
typedef _GLIBCXX_IMPL_UNORDERED_MAP<__stack_t, __stack_info, __stack_hash, __stack_hash> __gnu_profile::__trace_base< __object_info, __stack_info >::__stack_table_t
private

Constructor & Destructor Documentation

template<typename __object_info, typename __stack_info>
__gnu_profile::__trace_base< __object_info, __stack_info >::__trace_base ( )
inline
189  : __object_table(10000), __stack_table(10000),
190  __stack_table_byte_size(0), __id(0) { }
__object_table_t __object_table
Definition: profiler_trace.h:208
__stack_table_t __stack_table
Definition: profiler_trace.h:209
const char * __id
Definition: profiler_trace.h:213
std::size_t __stack_table_byte_size
Definition: profiler_trace.h:210
template<typename __object_info, typename __stack_info>
virtual __gnu_profile::__trace_base< __object_info, __stack_info >::~__trace_base ( )
inlinevirtual
192 { }

Member Function Documentation

template<typename __object_info, typename __stack_info >
void __gnu_profile::__trace_base< __object_info, __stack_info >::__add_object ( __object_t  object,
__object_info  __info 
)
232  {
233  if (__max_mem() == 0
234  || __object_table.size() * sizeof(__object_info) <= __max_mem())
235  {
236  this->__object_table_lock.lock();
237  __object_table.insert(typename __object_table_t::
238  value_type(__object, __info));
239  this->__object_table_lock.unlock();
240  }
241  }
__object_table_t __object_table
Definition: profiler_trace.h:208
std::size_t __max_mem()
Definition: profiler_trace.h:178
__gnu_cxx::__mutex __object_table_lock
Definition: profiler_trace.h:201
_GLIBCXX_IMPL_UNORDERED_MAP< __object_t, __object_info > __object_table_t
Definition: profiler_trace.h:204
template<typename __object_info , typename __stack_info >
void __gnu_profile::__trace_base< __object_info, __stack_info >::__collect_warnings ( __warning_vector_t __warnings)
220  {
221  for (typename __stack_table_t::iterator __it
222  = __stack_table.begin(); __it != __stack_table.end(); ++__it)
223  __warnings.push_back(__warning_data((*__it).second.__magnitude(),
224  (*__it).first, __id,
225  (*__it).second.__advice()));
226  }
__stack_table_t __stack_table
Definition: profiler_trace.h:209
const char * __id
Definition: profiler_trace.h:213
template<typename __object_info , typename __stack_info >
__object_info * __gnu_profile::__trace_base< __object_info, __stack_info >::__get_object_info ( __object_t  __object)
247  {
248  // XXX: Revisit this to see if we can decrease mutex spans.
249  // Without this mutex, the object table could be rehashed during an
250  // insertion on another thread, which could result in a segfault.
251  this->__object_table_lock.lock();
252  typename __object_table_t::iterator __object_it
253  = __object_table.find(__object);
254 
255  if (__object_it == __object_table.end())
256  {
257  this->__object_table_lock.unlock();
258  return 0;
259  }
260  else
261  {
262  this->__object_table_lock.unlock();
263  return &__object_it->second;
264  }
265  }
__object_table_t __object_table
Definition: profiler_trace.h:208
__gnu_cxx::__mutex __object_table_lock
Definition: profiler_trace.h:201
template<typename __object_info , typename __stack_info >
void __gnu_profile::__trace_base< __object_info, __stack_info >::__retire_object ( __object_t  __object)
271  {
272  this->__object_table_lock.lock();
273  this->__stack_table_lock.lock();
274  typename __object_table_t::iterator __object_it
275  = __object_table.find(__object);
276 
277  if (__object_it != __object_table.end())
278  {
279  const __object_info& __info = __object_it->second;
280  const __stack_t& __stack = __info.__stack();
281  typename __stack_table_t::iterator __stack_it
282  = __stack_table.find(__stack);
283 
284  if (__stack_it == __stack_table.end())
285  {
286  // First occurence of this call context.
287  if (__max_mem() == 0 || __stack_table_byte_size < __max_mem())
288  {
290  += (sizeof(__instruction_address_t) * __size(__stack)
291  + sizeof(__stack) + sizeof(__stack_info));
292  __stack_table.insert(make_pair(__stack,
293  __stack_info(__info)));
294  }
295  }
296  else
297  {
298  // Merge object info into info summary for this call context.
299  __stack_it->second.__merge(__info);
300  delete __stack;
301  }
302  __object_table.erase(__object);
303  }
304 
305  this->__object_table_lock.unlock();
306  this->__stack_table_lock.unlock();
307  }
__object_table_t __object_table
Definition: profiler_trace.h:208
std::size_t __max_mem()
Definition: profiler_trace.h:178
__gnu_cxx::__mutex __object_table_lock
Definition: profiler_trace.h:201
std::size_t __size(__stack_t __stack)
Definition: profiler_node.h:68
void * __instruction_address_t
Definition: profiler_node.h:43
__stack_table_t __stack_table
Definition: profiler_trace.h:209
__gnu_cxx::__mutex __stack_table_lock
Definition: profiler_trace.h:202
__stack_npt * __stack_t
Definition: profiler_node.h:45
std::size_t __stack_table_byte_size
Definition: profiler_trace.h:210
template<typename __object_info , typename __stack_info >
void __gnu_profile::__trace_base< __object_info, __stack_info >::__write ( FILE *  __f)
313  {
314  for (typename __stack_table_t::iterator __it
315  = __stack_table.begin(); __it != __stack_table.end(); ++__it)
316  if (__it->second.__is_valid())
317  {
318  std::fprintf(__f, __id);
319  std::fprintf(__f, "|");
320  __gnu_profile::__write(__f, __it->first);
321  std::fprintf(__f, "|");
322  __it->second.__write(__f);
323  }
324  }
void __write(FILE *__f, __stack_t __stack)
Definition: profiler_node.h:78
__stack_table_t __stack_table
Definition: profiler_trace.h:209
const char * __id
Definition: profiler_trace.h:213

Member Data Documentation

template<typename __object_info, typename __stack_info>
const char* __gnu_profile::__trace_base< __object_info, __stack_info >::__id
protected
template<typename __object_info, typename __stack_info>
__object_table_t __gnu_profile::__trace_base< __object_info, __stack_info >::__object_table
private
template<typename __object_info, typename __stack_info>
__gnu_cxx::__mutex __gnu_profile::__trace_base< __object_info, __stack_info >::__object_table_lock
private
template<typename __object_info, typename __stack_info>
__stack_table_t __gnu_profile::__trace_base< __object_info, __stack_info >::__stack_table
private
template<typename __object_info, typename __stack_info>
std::size_t __gnu_profile::__trace_base< __object_info, __stack_info >::__stack_table_byte_size
private
template<typename __object_info, typename __stack_info>
__gnu_cxx::__mutex __gnu_profile::__trace_base< __object_info, __stack_info >::__stack_table_lock
private

The documentation for this class was generated from the following file: