23 #if __TBB_STATISTICS_STDOUT    35 const char* StatGroupTitles[] = {
    36     "task objects", 
"tasks executed", 
"stealing attempts", 
"task proxies", 
"arena", 
"market", 
"priority ops", 
"prio ops details"    42 const char* StatFieldTitles[] = {
    43             "active", 
"freed", 
"big", NULL,
    44           "total", 
"w/o spawn", NULL,
    45        "succeeded", 
"failed", 
"conflicts", 
"backoffs", NULL,
    46             "mailed", 
"revoked", 
"stolen", 
"bypassed", 
"ignored", NULL,
    47                    "switches", 
"roundtrips", 
"avg.conc", 
"avg.allot", NULL,
    49             "ar.switch", 
"mkt.switch", 
"ar.reset", 
"ref.fixup", 
"avg.ar.pr", 
"avg.mkt.pr", NULL,
    50         "winnows", 
"reloads", 
"orphaned", 
"winnowed", 
"reloaded", NULL
    56 class statistics_logger {
    58     statistics_logger () {
    59         __TBB_ASSERT( sg_end - 1 == 1 << (
sizeof(StatGroupTitles)/
sizeof(*StatGroupTitles) - 1), NULL );
    61         my_file = fopen(
"statistics.txt",
"w");
    63             perror(
"fopen(\"statistics.txt\"\")");
    65         group_start_field[0] = 0;
    66         for ( 
size_t i = 0, j = 0; i < NumGroups; ++i, ++j ) {
    67             __TBB_ASSERT( StatFieldTitles[j], 
"Empty group occurred" );
    68             while ( StatFieldTitles[j] )
    70             group_start_field[i + 1] = j - i; 
    73                       "Wrong number of elements in StatFieldTitles" );
    74         dump( 
"\n%-*s", IDColumnWidth, 
"");
    75         process_groups( &statistics_logger::print_group_title );
    76         dump( 
"%-*s", IDColumnWidth, 
"ID");
    77         process_groups( &statistics_logger::print_field_titles );
    80     ~statistics_logger () { fclose(my_file); }
    82     void record( 
const statistics_counters& c, 
size_t id ) {
    84         counters_to_dump = &c;
    85 #if __TBB_STATISTICS_TOTALS_ONLY    86         if ( 
id == arena_counters_total ) {
    87             dump( 
"%-*s", IDColumnWidth, 
"Tot" );
    88             process_groups( &statistics_logger::print_field_values );
    91         const char* idString = NULL;
    94             idString = 
"M"; 
break;
    95         case workers_counters_total:
    96             idString = 
"Wtot"; 
break;
    97         case arena_counters_total:
    98             idString = 
"Tot"; 
break;
   100             dump( 
"W%-*u", IDColumnWidth - 1, 
id );
   103             dump( 
"%-*s", IDColumnWidth, idString );
   104         process_groups( &statistics_logger::print_field_values );
   108     static const size_t IDColumnWidth = 5;
   109     static const size_t StatisticsColumnWidth = 10;
   110     static const size_t NumGroups = 
sizeof(StatGroupTitles)/
sizeof(
char*);
   118     size_t group_start_field[NumGroups + 1];
   120     const statistics_counters* counters_to_dump;
   122     static const size_t NumFields = 
sizeof(StatFieldTitles)/
sizeof(*StatFieldTitles) - NumGroups;
   123     bool averages_fields[NumFields];
   125     void dump ( 
char const* fmt, ... ) {
   128             va_start( args, fmt );
   129             vfprintf( my_file, fmt, args );
   132 #if __TBB_STATISTICS_STDOUT   133         va_start( args, fmt );
   134         vprintf( fmt, args );
   139     void process_groups ( 
void (statistics_logger::*per_group_action)(
size_t group_idx) ) {
   140         for ( 
size_t i = 0, group_flag = 1; i < NumGroups; ++i, group_flag <<= 1 ) {
   141             __TBB_ASSERT( group_flag < sg_end, 
"StatGroupTitles contents is incompatible with statistics_groups definition" );
   142             if ( __TBB_ActiveStatisticsGroups & group_flag )
   143                 (this->*per_group_action)( i );
   148     void print_group_title ( 
size_t group_idx ) {
   149         dump( 
"%-*s", (group_start_field[group_idx + 1] - group_start_field[group_idx]) * (StatisticsColumnWidth + 1),
   150                         StatGroupTitles[group_idx] );
   153     void print_field_titles ( 
size_t group_idx ) {
   155         size_t i = group_start_field[group_idx] + group_idx;
   156         while ( StatFieldTitles[i] ) {
   157             averages_fields[i - group_idx] = strncmp(StatFieldTitles[i], 
"avg.", 4) == 0;
   158             dump( 
"%-*s ", StatisticsColumnWidth, StatFieldTitles[i++] );
   162     void print_field_values ( 
size_t group_idx ) {
   163         size_t begin = group_start_field[group_idx],
   164                end = group_start_field[group_idx + 1];
   165         for ( 
size_t i = 
begin; i < 
end; ++i ) {
   166             if ( averages_fields[i] )
   167                 dump( 
"%-*.2f ", StatisticsColumnWidth, (
double)counters_to_dump->field(i)/counters_to_dump->tasks_executed );
   169                 dump( 
"%-*ld ", StatisticsColumnWidth, counters_to_dump->field(i) );
   174 static statistics_logger the_statistics;
   176 void dump_statistics ( 
const statistics_counters& c, 
size_t id ) {
   177     the_statistics.record(c, 
id);
 void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp end
 
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp begin
 
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t size
 
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
 
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void * lock