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 <irog...@google.com>
---
 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 2c684fd3c4e3..2a6456fa178b 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,
@@ -497,8 +498,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;
 
@@ -511,6 +512,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);
@@ -518,14 +520,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;
@@ -536,6 +530,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)
@@ -554,7 +549,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;
 
@@ -565,13 +561,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) {
+               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.645.ge9eca65c58-goog

Reply via email to