On Wed, May 20, 2020 at 12:28:10AM -0700, Ian Rogers wrote: > Currently event groups are placed into groups_list at the same time as > the events string containing the events is built. Separate these two > operations and build the groups_list first, then the event string from > the groups_list. This adds an ability to reorder the groups_list that > will be used in a later patch. > > Signed-off-by: Ian Rogers <irogers@xxxxxxxxxx> > --- > tools/perf/util/metricgroup.c | 38 +++++++++++++++++++++++------------ > 1 file changed, 25 insertions(+), 13 deletions(-) > > diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c > index 7a43ee0a2e40..afd960d03a77 100644 > --- a/tools/perf/util/metricgroup.c > +++ b/tools/perf/util/metricgroup.c > @@ -90,6 +90,7 @@ struct egroup { > const char *metric_expr; > const char *metric_unit; > int runtime; > + bool has_constraint; > }; > > static struct evsel *find_evsel_group(struct evlist *perf_evlist, > @@ -485,8 +486,8 @@ int __weak arch_get_runtimeparam(void) > return 1; > } > > -static int __metricgroup__add_metric(struct strbuf *events, > - struct list_head *group_list, struct pmu_event *pe, int runtime) > +static int __metricgroup__add_metric(struct list_head *group_list, > + struct pmu_event *pe, int runtime) > { > struct egroup *eg; > > @@ -499,6 +500,7 @@ static int __metricgroup__add_metric(struct strbuf *events, > eg->metric_expr = pe->metric_expr; > eg->metric_unit = pe->unit; > eg->runtime = runtime; > + eg->has_constraint = metricgroup__has_constraint(pe); > > if (expr__find_other(pe->metric_expr, NULL, &eg->pctx, runtime) < 0) { > expr__ctx_clear(&eg->pctx); > @@ -506,14 +508,6 @@ static int __metricgroup__add_metric(struct strbuf *events, > return -EINVAL; > } > > - if (events->len > 0) > - strbuf_addf(events, ","); > - > - if (metricgroup__has_constraint(pe)) > - metricgroup__add_metric_non_group(events, &eg->pctx); > - else > - metricgroup__add_metric_weak_group(events, &eg->pctx); > - > list_add_tail(&eg->nd, group_list); > > return 0; > @@ -524,6 +518,7 @@ static int metricgroup__add_metric(const char *metric, struct strbuf *events, > { > struct pmu_events_map *map = perf_pmu__find_map(NULL); > struct pmu_event *pe; > + struct egroup *eg; > int i, ret = -EINVAL; > > if (!map) > @@ -542,7 +537,8 @@ static int metricgroup__add_metric(const char *metric, struct strbuf *events, > pr_debug("metric expr %s for %s\n", pe->metric_expr, pe->metric_name); > > if (!strstr(pe->metric_expr, "?")) { > - ret = __metricgroup__add_metric(events, group_list, pe, 1); > + ret = __metricgroup__add_metric(group_list, > + pe, 1); > } else { > int j, count; > > @@ -553,13 +549,29 @@ static int metricgroup__add_metric(const char *metric, struct strbuf *events, > * those events to group_list. > */ > > - for (j = 0; j < count; j++) > - ret = __metricgroup__add_metric(events, group_list, pe, j); > + for (j = 0; j < count; j++) { > + ret = __metricgroup__add_metric( > + group_list, pe, j); > + } > } > if (ret == -ENOMEM) > break; > } > } > + if (!ret) { could you please do instead: if (ret) return ret; so the code below cuts down one indent level and you don't need to split up the lines thanks, jirka > + list_for_each_entry(eg, group_list, nd) { > + if (events->len > 0) > + strbuf_addf(events, ","); > + > + if (eg->has_constraint) { > + metricgroup__add_metric_non_group(events, > + &eg->pctx); > + } else { > + metricgroup__add_metric_weak_group(events, > + &eg->pctx); > + } > + } > + } > return ret; > } > > -- > 2.26.2.761.g0e0b3e54be-goog >