30 #ifndef _GLIBCXX_PROFILE_PROFILER_TRACE_H
31 #define _GLIBCXX_PROFILE_PROFILER_TRACE_H 1
37 #if __cplusplus >= 201103L
38 #define _GLIBCXX_IMPL_UNORDERED_MAP std::_GLIBCXX_STD_C::unordered_map
42 #define _GLIBCXX_IMPL_UNORDERED_MAP std::tr1::unordered_map
55 namespace __gnu_profile
65 typedef _GLIBCXX_IMPL_UNORDERED_MAP<std::string, std::string>
__env_t;
135 {
"__vector_shift_cost_factor", 1.0});
137 {
"__vector_iterate_cost_factor", 1.0});
139 {
"__vector_resize_cost_factor", 1.0});
141 {
"__list_shift_cost_factor", 0.0});
143 {
"__list_iterate_cost_factor", 10.0});
145 {
"__list_resize_cost_factor", 0.0});
147 {
"__map_insert_cost_factor", 1.5});
149 {
"__map_erase_cost_factor", 1.5});
151 {
"__map_find_cost_factor", 1});
153 {
"__map_iterate_cost_factor", 2.3});
155 {
"__umap_insert_cost_factor", 12.0});
157 {
"__umap_erase_cost_factor", 12.0});
159 {
"__umap_find_cost_factor", 10.0});
161 {
"__umap_iterate_cost_factor", 1.7});
182 template<
typename __
object_info,
typename __stack_info>
216 template<
typename __
object_info,
typename __stack_info>
221 for (
typename __stack_table_t::iterator __it
222 = __stack_table.begin(); __it != __stack_table.end(); ++__it)
225 (*__it).second.__advice()));
228 template<
typename __
object_info,
typename __stack_info>
234 || __object_table.size() *
sizeof(__object_info) <=
__max_mem())
236 this->__object_table_lock.lock();
238 value_type(__object, __info));
239 this->__object_table_lock.unlock();
243 template<
typename __
object_info,
typename __stack_info>
251 this->__object_table_lock.lock();
252 typename __object_table_t::iterator __object_it
253 = __object_table.find(__object);
255 if (__object_it == __object_table.end())
257 this->__object_table_lock.unlock();
262 this->__object_table_lock.unlock();
263 return &__object_it->second;
267 template<
typename __
object_info,
typename __stack_info>
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);
277 if (__object_it != __object_table.end())
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);
284 if (__stack_it == __stack_table.end())
289 __stack_table_byte_size
291 +
sizeof(__stack) +
sizeof(__stack_info));
292 __stack_table.insert(make_pair(__stack,
293 __stack_info(__info)));
299 __stack_it->second.__merge(__info);
302 __object_table.erase(__object);
305 this->__object_table_lock.unlock();
306 this->__stack_table_lock.unlock();
309 template<
typename __
object_info,
typename __stack_info>
314 for (
typename __stack_table_t::iterator __it
315 = __stack_table.begin(); __it != __stack_table.end(); ++__it)
316 if (__it->second.__is_valid())
318 std::fprintf(__f, __id);
319 std::fprintf(__f,
"|");
321 std::fprintf(__f,
"|");
322 __it->second.__write(__f);
329 char* __env_value = std::getenv(__env_var);
333 long __converted_value = std::strtol(__env_value, 0, 10);
334 if (
errno || __converted_value < 0)
337 "Bad value for environment variable '%s'.\n",
342 return static_cast<std::size_t>(__converted_value);
345 return __default_value;
367 const float __log_base = 10.0;
377 while (__f > __log_base)
382 return __sign * __result;
391 std::size_t __ext_len = __builtin_strlen(__extension);
392 char* __file_name =
new char[__root_len + 1 + __ext_len + 1];
393 __builtin_memcpy(__file_name,
396 *(__file_name + __root_len) =
'.';
397 __builtin_memcpy(__file_name + __root_len + 1,
398 __extension, __ext_len + 1);
400 FILE* __out_file = std::fopen(__file_name,
"w");
403 std::fprintf(stderr,
"Could not open trace file '%s'.\n",
408 delete[] __file_name;
423 std::fprintf(
__file,
": improvement = %d",
425 std::fprintf(
__file,
": call stack = ");
427 std::fprintf(
__file,
": advice = %s\n",
454 std::fclose(__raw_file);
459 __top_n(__warnings, __top_warnings, __cutoff);
462 __for_each(__top_warnings.begin(), __top_warnings.end(),
464 std::fclose(__warn_file);
474 if (__env_trace_file_name)
484 char* __env_max_warn_count_str
487 if (__env_max_warn_count_str)
489 =
static_cast<std::size_t>(std::atoi(__env_max_warn_count_str));
496 __conf_file_name +=
".conf";
498 std::ifstream __conf_file(__conf_file_name.c_str());
500 if (__conf_file.is_open())
506 std::string::size_type __i = __line.find_first_not_of(
" \t\n\v");
508 if (__line.length() <= 0 || __line[__i] ==
'#')
514 __line.erase(
__remove(__line.begin(), __line.end(),
' '),
516 std::string::size_type __pos = __line.find(
"=");
517 std::string __factor_name = __line.substr(0, __pos);
518 std::string::size_type __end = __line.find_first_of(
";\n");
519 std::string __factor_value = __line.substr(__pos + 1, __end - __pos);
554 const char* __env_value = std::getenv(__factor->
__env_var);
559 __env_t::iterator __it
562 __env_value = (*__it).second.c_str();
566 __factor->
__value = std::atof(__env_value);
__cost_factor_writer(FILE *__f)
Definition: profiler_trace.h:529
#define _GLIBCXX_PROFILE_MAX_WARN_COUNT
Definition: profiler.h:379
Definition: profiler_trace.h:412
#define _GLIBCXX_IMPL_UNORDERED_MAP
Definition: profiler_trace.h:42
std::string __warning_message
Definition: profiler_trace.h:78
void operator()(__cost_factor *__factor)
Definition: profiler_trace.h:551
void operator()(const __warning_data &__info)
Definition: profiler_trace.h:420
void __trace_list_to_vector_init()
Definition: profiler_list_to_vector.h:252
int __log_magnitude(float __f)
Definition: profiler_trace.h:365
bool __is_on()
Definition: profiler_state.h:57
_GLIBCXX_PROFILE_DEFINE_DATA(__state_type, __state, __INVALID)
void __write(FILE *__f, __stack_t __stack)
Definition: profiler_node.h:78
__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
void __trace_vector_size_report(FILE *, __warning_vector_t &)
Definition: profiler_vector_size.h:56
const char * __warning_id
Definition: profiler_trace.h:77
void __trace_hash_func_init()
Definition: profiler_hash_func.h:140
#define _GLIBCXX_PROFILE_MEM_PER_DIAGNOSTIC
Definition: profiler.h:389
_Function __for_each(_InputIterator __first, _InputIterator __last, _Function __f)
Definition: profiler_algos.h:84
void __set_trace_path()
Definition: profiler_trace.h:470
void __set_max_warn_count()
Definition: profiler_trace.h:482
_ForwardIterator __remove(_ForwardIterator __first, _ForwardIterator __last, const _Tp &__value)
Definition: profiler_algos.h:94
void operator()(const __cost_factor *__factor)
Definition: profiler_trace.h:533
std::size_t __size(__stack_t __stack)
Definition: profiler_node.h:68
void * __instruction_address_t
Definition: profiler_node.h:43
__warning_data(float __m, __stack_t __c, const char *__id, const std::string &__msg)
Definition: profiler_trace.h:83
bool operator<(const __warning_data &__other) const
Definition: profiler_trace.h:89
_GLIBCXX_PROFILE_DEFINE_UNINIT_DATA(__env_t, __env)
Definition: profiler_trace.h:118
FILE * __open_output_file(const char *__extension)
Definition: profiler_trace.h:386
__object_info * __get_object_info(__object_t __object)
Definition: profiler_trace.h:246
FILE * __file
Definition: profiler_trace.h:414
Vector-to-list instrumentation producer.
Definition: profiler_vector_to_list.h:158
void __trace_list_to_vector_report(FILE *__f, __warning_vector_t &__warnings)
Definition: profiler_list_to_vector.h:256
void __read_cost_factors()
Definition: profiler_trace.h:493
basic_string< char > string
Definition: string:1153
__stack_table_t __stack_table
Definition: profiler_trace.h:209
const _Tp & min(const _Tp &__a, const _Tp &__b)
Equivalent to std::min.
Definition: base.h:144
std::_GLIBCXX_STD_C::vector< __warning_data > __warning_vector_t
Definition: profiler_trace.h:93
__trace_base()
Definition: profiler_trace.h:188
bool __turn_on()
Definition: profiler_state.h:49
Base class for all trace producers.
Definition: profiler_trace.h:183
bool __turn_off()
Definition: profiler_state.h:53
__stack_t __context
Definition: profiler_trace.h:76
void __write_cost_factors()
Definition: profiler_trace.h:539
__warning_data()
Definition: profiler_trace.h:80
__warn(FILE *__f)
Definition: profiler_trace.h:416
#define _GLIBCXX_PROFILE_MAX_STACK_DEPTH_ENV_VAR
Definition: profiler.h:385
void __report(void)
Final report method, registered with atexit.
Definition: profiler_trace.h:440
_GLIBCXX_IMPL_UNORDERED_MAP< __object_t, __object_info > __object_table_t
Definition: profiler_trace.h:204
#define _GLIBCXX_PROFILE_MAX_STACK_DEPTH
Definition: profiler.h:382
#define errno
Definition: cerrno:48
bool __profcxx_init()
This function must be called by each instrumentation point.
Definition: profiler_trace.h:649
__gnu_cxx::__mutex __stack_table_lock
Definition: profiler_trace.h:202
float __magnitude
Definition: profiler_trace.h:75
void __set_max_mem()
Definition: profiler_trace.h:357
void __trace_list_to_slist_init()
Definition: profiler_list_to_slist.h:157
void __trace_map_to_unordered_map_init()
Definition: profiler_map_to_unordered_map.h:189
void __trace_list_to_slist_report(FILE *__f, __warning_vector_t &__warnings)
Definition: profiler_list_to_slist.h:161
Map-to-unordered_map instrumentation producer.
Definition: profiler_map_to_unordered_map.h:179
std::_GLIBCXX_STD_C::vector< __cost_factor * > __cost_factor_vector
Definition: profiler_trace.h:124
#define _GLIBCXX_PROFILE_DATA(__name)
Definition: profiler.h:48
Algorithms used by the profile extension.
void __trace_hashtable_size_report(FILE *__f, __warning_vector_t &__warnings)
Definition: profiler_hashtable_size.h:56
Hashtable size instrumentation trace producer.
Definition: profiler_vector_size.h:42
void __collect_warnings(__warning_vector_t &__warnings)
Definition: profiler_trace.h:219
void __trace_map_to_unordered_map_report(FILE *__f, __warning_vector_t &__warnings)
Definition: profiler_map_to_unordered_map.h:193
Representation of a warning.
Definition: profiler_trace.h:73
std::size_t __env_to_size_t(const char *__env_var, std::size_t __default_value)
Definition: profiler_trace.h:327
Hashtable size instrumentation trace producer.
Definition: profiler_hashtable_size.h:42
#define _GLIBCXX_PROFILE_MAX_WARN_COUNT_ENV_VAR
Definition: profiler.h:375
void __write(FILE *__f)
Definition: profiler_trace.h:312
Definition: profiler_trace.h:548
Definition: profiler_list_to_slist.h:111
__stack_npt * __stack_t
Definition: profiler_node.h:45
#define _GLIBCXX_PROFILE_TRACE_ENV_VAR
Definition: profiler.h:372
void __add_object(__object_t object, __object_info __info)
Definition: profiler_trace.h:231
__SIZE_TYPE__ size_t
Definition: stddef.h:212
Data structures to represent a single profiling event.
_GLIBCXX_IMPL_UNORDERED_MAP< __stack_t, __stack_info, __stack_hash, __stack_hash > __stack_table_t
Definition: profiler_trace.h:207
void __retire_object(__object_t __object)
Definition: profiler_trace.h:270
std::basic_istream< _CharT, _Traits > & getline(std::basic_istream< _CharT, _Traits > &__is, basic_string< _CharT, _Traits, _Allocator > &__str, _CharT __delim)
Definition: string:1132
Definition: profiler_list_to_vector.h:161
bool __is_invalid()
Definition: profiler_state.h:65
FILE * __file
Definition: profiler_trace.h:527
void __top_n(const _Container &__input, _Container &__output, typename _Container::size_type __n)
Definition: profiler_algos.h:72
#define _GLIBCXX_PROFILE_TRACE_PATH_ROOT
Definition: profiler.h:369
void __set_cost_factors()
Definition: profiler_trace.h:571
const char * __id
Definition: profiler_trace.h:213
std::size_t __stack_table_byte_size
Definition: profiler_trace.h:210
void __trace_hashtable_size_init()
Definition: profiler_hashtable_size.h:52
Hash function for summary trace using call stack as index.
Definition: profiler_node.h:89
#define _GLIBCXX_PROFILE_MEM_PER_DIAGNOSTIC_ENV_VAR
Definition: profiler.h:392
void __trace_hash_func_report(FILE *__f, __warning_vector_t &__warnings)
Definition: profiler_hash_func.h:144
std::size_t __stack_max_depth()
Definition: profiler_trace.h:174
Definition: profiler_trace.h:525
void __set_max_stack_trace_depth()
Definition: profiler_trace.h:349
float __value
Definition: profiler_trace.h:121
_GLIBCXX_IMPL_UNORDERED_MAP< std::string, std::string > __env_t
Internal environment. Values can be set one of two ways:
Definition: profiler_trace.h:65
void __trace_vector_size_init()
Definition: profiler_vector_size.h:52
void __trace_vector_to_list_init()
Definition: profiler_vector_to_list.h:266
Hash performance instrumentation producer.
Definition: profiler_hash_func.h:105
const char * __env_var
Definition: profiler_trace.h:120
const void * __object_t
Definition: profiler_node.h:42
void __trace_vector_to_list_report(FILE *, __warning_vector_t &)
Definition: profiler_vector_to_list.h:270
void __profcxx_init_unconditional()
Definition: profiler_trace.h:608
virtual ~__trace_base()
Definition: profiler_trace.h:192