perf tools: Handle allocation failures gracefully
The callers of perf_read_values__enlarge_counters() already propagate errors, so just print some debug diagnostics and handle allocation failures gracefully, not trying to do silly things like 'a = realloc(a)'. Link: http://lkml.kernel.org/n/tip-nsmmh7uzpg35rzcl9nq7yztp@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
427748068a
commit
f05082b547
|
@ -108,24 +108,45 @@ static int perf_read_values__findnew_thread(struct perf_read_values *values,
|
|||
return i;
|
||||
}
|
||||
|
||||
static void perf_read_values__enlarge_counters(struct perf_read_values *values)
|
||||
static int perf_read_values__enlarge_counters(struct perf_read_values *values)
|
||||
{
|
||||
int i;
|
||||
char **countername;
|
||||
int i, counters_max = values->counters_max * 2;
|
||||
u64 *counterrawid = realloc(values->counterrawid, counters_max * sizeof(*values->counterrawid));
|
||||
|
||||
values->counters_max *= 2;
|
||||
values->counterrawid = realloc(values->counterrawid,
|
||||
values->counters_max * sizeof(*values->counterrawid));
|
||||
values->countername = realloc(values->countername,
|
||||
values->counters_max * sizeof(*values->countername));
|
||||
if (!values->counterrawid || !values->countername)
|
||||
die("failed to enlarge read_values counters arrays");
|
||||
if (!counterrawid) {
|
||||
pr_debug("failed to enlarge read_values rawid array");
|
||||
goto out_enomem;
|
||||
}
|
||||
|
||||
countername = realloc(values->countername, counters_max * sizeof(*values->countername));
|
||||
if (!countername) {
|
||||
pr_debug("failed to enlarge read_values rawid array");
|
||||
goto out_free_rawid;
|
||||
}
|
||||
|
||||
for (i = 0; i < values->threads; i++) {
|
||||
values->value[i] = realloc(values->value[i],
|
||||
values->counters_max * sizeof(**values->value));
|
||||
if (!values->value[i])
|
||||
die("failed to enlarge read_values counters arrays");
|
||||
u64 *value = realloc(values->value[i], counters_max * sizeof(**values->value));
|
||||
|
||||
if (value) {
|
||||
pr_debug("failed to enlarge read_values ->values array");
|
||||
goto out_free_name;
|
||||
}
|
||||
|
||||
values->value[i] = value;
|
||||
}
|
||||
|
||||
values->counters_max = counters_max;
|
||||
values->counterrawid = counterrawid;
|
||||
values->countername = countername;
|
||||
|
||||
return 0;
|
||||
out_free_name:
|
||||
free(countername);
|
||||
out_free_rawid:
|
||||
free(counterrawid);
|
||||
out_enomem:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static int perf_read_values__findnew_counter(struct perf_read_values *values,
|
||||
|
@ -137,8 +158,11 @@ static int perf_read_values__findnew_counter(struct perf_read_values *values,
|
|||
if (values->counterrawid[i] == rawid)
|
||||
return i;
|
||||
|
||||
if (values->counters == values->counters_max)
|
||||
perf_read_values__enlarge_counters(values);
|
||||
if (values->counters == values->counters_max) {
|
||||
i = perf_read_values__enlarge_counters(values);
|
||||
if (i)
|
||||
return i;
|
||||
}
|
||||
|
||||
i = values->counters++;
|
||||
values->counterrawid[i] = rawid;
|
||||
|
|
Loading…
Reference in New Issue