1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdlib.h> 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util.h" 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "values.h" 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid perf_read_values_init(struct perf_read_values *values) 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->threads_max = 16; 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->pid = malloc(values->threads_max * sizeof(*values->pid)); 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->tid = malloc(values->threads_max * sizeof(*values->tid)); 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->value = malloc(values->threads_max * sizeof(*values->value)); 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!values->pid || !values->tid || !values->value) 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng die("failed to allocate read_values threads arrays"); 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->threads = 0; 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->counters_max = 16; 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->counterrawid = malloc(values->counters_max 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * sizeof(*values->counterrawid)); 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->countername = malloc(values->counters_max 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * sizeof(*values->countername)); 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!values->counterrawid || !values->countername) 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng die("failed to allocate read_values counters arrays"); 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->counters = 0; 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid perf_read_values_destroy(struct perf_read_values *values) 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int i; 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!values->threads_max || !values->counters_max) 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return; 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (i = 0; i < values->threads; i++) 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(values->value[i]); 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(values->value); 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(values->pid); 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(values->tid); 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(values->counterrawid); 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (i = 0; i < values->counters; i++) 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(values->countername[i]); 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(values->countername); 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void perf_read_values__enlarge_threads(struct perf_read_values *values) 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->threads_max *= 2; 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->pid = realloc(values->pid, 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->threads_max * sizeof(*values->pid)); 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->tid = realloc(values->tid, 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->threads_max * sizeof(*values->tid)); 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->value = realloc(values->value, 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->threads_max * sizeof(*values->value)); 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!values->pid || !values->tid || !values->value) 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng die("failed to enlarge read_values threads arrays"); 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int perf_read_values__findnew_thread(struct perf_read_values *values, 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u32 pid, u32 tid) 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int i; 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (i = 0; i < values->threads; i++) 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (values->pid[i] == pid && values->tid[i] == tid) 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return i; 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (values->threads == values->threads_max) 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_read_values__enlarge_threads(values); 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng i = values->threads++; 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->pid[i] = pid; 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->tid[i] = tid; 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->value[i] = malloc(values->counters_max * sizeof(**values->value)); 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!values->value[i]) 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng die("failed to allocate read_values counters array"); 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return i; 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void perf_read_values__enlarge_counters(struct perf_read_values *values) 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int i; 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->counters_max *= 2; 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->counterrawid = realloc(values->counterrawid, 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->counters_max * sizeof(*values->counterrawid)); 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->countername = realloc(values->countername, 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->counters_max * sizeof(*values->countername)); 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!values->counterrawid || !values->countername) 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng die("failed to enlarge read_values counters arrays"); 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (i = 0; i < values->threads; i++) { 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->value[i] = realloc(values->value[i], 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->counters_max * sizeof(**values->value)); 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!values->value[i]) 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng die("failed to enlarge read_values counters arrays"); 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int perf_read_values__findnew_counter(struct perf_read_values *values, 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 rawid, const char *name) 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int i; 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (i = 0; i < values->counters; i++) 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (values->counterrawid[i] == rawid) 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return i; 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (values->counters == values->counters_max) 109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_read_values__enlarge_counters(values); 110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng i = values->counters++; 112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->counterrawid[i] = rawid; 113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->countername[i] = strdup(name); 114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return i; 116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid perf_read_values_add_value(struct perf_read_values *values, 119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u32 pid, u32 tid, 120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 rawid, const char *name, u64 value) 121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int tindex, cindex; 123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng tindex = perf_read_values__findnew_thread(values, pid, tid); 125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng cindex = perf_read_values__findnew_counter(values, rawid, name); 126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng values->value[tindex][cindex] = value; 128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void perf_read_values__display_pretty(FILE *fp, 131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_read_values *values) 132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int i, j; 134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int pidwidth, tidwidth; 135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int *counterwidth; 136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng counterwidth = malloc(values->counters * sizeof(*counterwidth)); 138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!counterwidth) 139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng die("failed to allocate counterwidth array"); 140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng tidwidth = 3; 141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pidwidth = 3; 142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (j = 0; j < values->counters; j++) 143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng counterwidth[j] = strlen(values->countername[j]); 144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (i = 0; i < values->threads; i++) { 145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int width; 146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng width = snprintf(NULL, 0, "%d", values->pid[i]); 148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (width > pidwidth) 149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pidwidth = width; 150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng width = snprintf(NULL, 0, "%d", values->tid[i]); 151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (width > tidwidth) 152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng tidwidth = width; 153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (j = 0; j < values->counters; j++) { 154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng width = snprintf(NULL, 0, "%" PRIu64, values->value[i][j]); 155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (width > counterwidth[j]) 156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng counterwidth[j] = width; 157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(fp, "# %*s %*s", pidwidth, "PID", tidwidth, "TID"); 161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (j = 0; j < values->counters; j++) 162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(fp, " %*s", counterwidth[j], values->countername[j]); 163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(fp, "\n"); 164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (i = 0; i < values->threads; i++) { 166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(fp, " %*d %*d", pidwidth, values->pid[i], 167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng tidwidth, values->tid[i]); 168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (j = 0; j < values->counters; j++) 169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(fp, " %*" PRIu64, 170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng counterwidth[j], values->value[i][j]); 171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(fp, "\n"); 172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng free(counterwidth); 174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void perf_read_values__display_raw(FILE *fp, 177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_read_values *values) 178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int width, pidwidth, tidwidth, namewidth, rawwidth, countwidth; 180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int i, j; 181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng tidwidth = 3; /* TID */ 183e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pidwidth = 3; /* PID */ 184e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng namewidth = 4; /* "Name" */ 185e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng rawwidth = 3; /* "Raw" */ 186e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng countwidth = 5; /* "Count" */ 187e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 188e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (i = 0; i < values->threads; i++) { 189e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng width = snprintf(NULL, 0, "%d", values->pid[i]); 190e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (width > pidwidth) 191e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pidwidth = width; 192e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng width = snprintf(NULL, 0, "%d", values->tid[i]); 193e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (width > tidwidth) 194e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng tidwidth = width; 195e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 196e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (j = 0; j < values->counters; j++) { 197e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng width = strlen(values->countername[j]); 198e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (width > namewidth) 199e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng namewidth = width; 200e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng width = snprintf(NULL, 0, "%" PRIx64, values->counterrawid[j]); 201e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (width > rawwidth) 202e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng rawwidth = width; 203e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 204e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (i = 0; i < values->threads; i++) { 205e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (j = 0; j < values->counters; j++) { 206e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng width = snprintf(NULL, 0, "%" PRIu64, values->value[i][j]); 207e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (width > countwidth) 208e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng countwidth = width; 209e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 210e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 211e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 212e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(fp, "# %*s %*s %*s %*s %*s\n", 213e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pidwidth, "PID", tidwidth, "TID", 214e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng namewidth, "Name", rawwidth, "Raw", 215e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng countwidth, "Count"); 216e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (i = 0; i < values->threads; i++) 217e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (j = 0; j < values->counters; j++) 218e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fprintf(fp, " %*d %*d %*s %*" PRIx64 " %*" PRIu64, 219e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pidwidth, values->pid[i], 220e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng tidwidth, values->tid[i], 221e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng namewidth, values->countername[j], 222e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng rawwidth, values->counterrawid[j], 223e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng countwidth, values->value[i][j]); 224e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 225e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 226e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid perf_read_values_display(FILE *fp, struct perf_read_values *values, int raw) 227e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 228e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (raw) 229e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_read_values__display_raw(fp, values); 230e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng else 231e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_read_values__display_pretty(fp, values); 232e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 233