To aid supporting system event metric groups, break up the function
metricgroup__print() into a part which iterates metrics and a part
which actually "prints" the metric.

Signed-off-by: John Garry <[email protected]>
---
 tools/perf/util/metricgroup.c | 117 ++++++++++++++++++++++++------------------
 1 file changed, 66 insertions(+), 51 deletions(-)

diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
index d1033756a1bc..31e97e24c2b0 100644
--- a/tools/perf/util/metricgroup.c
+++ b/tools/perf/util/metricgroup.c
@@ -315,6 +315,68 @@ static void metricgroup__print_strlist(struct strlist 
*metrics, bool raw)
                putchar('\n');
 }
 
+
+static void metricgroup__print_pmu_event(struct pmu_event *pe,
+                                        bool metricgroups, char *filter,
+                                        bool raw, bool details,
+                                        struct rblist *groups,
+                                        struct strlist *metriclist)
+{
+       const char *g;
+
+       g = pe->metric_group;
+       if (!g && pe->metric_name) {
+               if (pe->name)
+                       return;
+               g = "No_group";
+       }
+
+       if (g) {
+               char *omg;
+               char *mg = strdup(g);
+
+               if (!mg)
+                       return;
+               omg = mg;
+               while ((g = strsep(&mg, ";")) != NULL) {
+                       struct mep *me;
+                       char *s;
+
+                       g = skip_spaces(g);
+                       if (*g == 0)
+                               g = "No_group";
+                       if (filter && !strstr(g, filter))
+                               continue;
+                       if (raw)
+                               s = (char *)pe->metric_name;
+                       else {
+                               if (asprintf(&s, "%s\n%*s%s]", pe->metric_name,
+                                            8, "[", pe->desc) < 0)
+                                       return;
+
+                               if (details) {
+                                       if (asprintf(&s, "%s\n%*s%s]", s, 8,
+                                                    "[", pe->metric_expr) < 0)
+                                               return;
+                               }
+                       }
+
+                       if (!s)
+                               continue;
+
+                       if (!metricgroups) {
+                               strlist__add(metriclist, s);
+                       } else {
+                               me = mep_lookup(groups, g);
+                               if (!me)
+                                       continue;
+                               strlist__add(me->metrics, s);
+                       }
+               }
+               free(omg);
+       }
+}
+
 void metricgroup__print(bool metrics, bool metricgroups, char *filter,
                        bool raw, bool details)
 {
@@ -339,63 +401,15 @@ void metricgroup__print(bool metrics, bool metricgroups, 
char *filter,
        groups.node_cmp = mep_cmp;
        groups.node_delete = mep_delete;
        for (i = 0; ; i++) {
-               const char *g;
                pe = &map->table[i];
 
                if (!pe->name && !pe->metric_group && !pe->metric_name)
                        break;
                if (!pe->metric_expr)
                        continue;
-               g = pe->metric_group;
-               if (!g && pe->metric_name) {
-                       if (pe->name)
-                               continue;
-                       g = "No_group";
-               }
-               if (g) {
-                       char *omg;
-                       char *mg = strdup(g);
-
-                       if (!mg)
-                               return;
-                       omg = mg;
-                       while ((g = strsep(&mg, ";")) != NULL) {
-                               struct mep *me;
-                               char *s;
-
-                               g = skip_spaces(g);
-                               if (*g == 0)
-                                       g = "No_group";
-                               if (filter && !strstr(g, filter))
-                                       continue;
-                               if (raw)
-                                       s = (char *)pe->metric_name;
-                               else {
-                                       if (asprintf(&s, "%s\n%*s%s]",
-                                                    pe->metric_name, 8, "[", 
pe->desc) < 0)
-                                               return;
-
-                                       if (details) {
-                                               if (asprintf(&s, "%s\n%*s%s]",
-                                                            s, 8, "[", 
pe->metric_expr) < 0)
-                                                       return;
-                                       }
-                               }
-
-                               if (!s)
-                                       continue;
 
-                               if (!metricgroups) {
-                                       strlist__add(metriclist, s);
-                               } else {
-                                       me = mep_lookup(&groups, g);
-                                       if (!me)
-                                               continue;
-                                       strlist__add(me->metrics, s);
-                               }
-                       }
-                       free(omg);
-               }
+               metricgroup__print_pmu_event(pe, metricgroups, filter, raw,
+                                            details, &groups, metriclist);
        }
 
        if (metricgroups && !raw)
@@ -407,7 +421,8 @@ void metricgroup__print(bool metrics, bool metricgroups, 
char *filter,
                struct mep *me = container_of(node, struct mep, nd);
 
                if (metricgroups)
-                       printf("%s%s%s", me->name, metrics && !raw ? ":" : "", 
raw ? " " : "\n");
+                       printf("%s%s%s", me->name, metrics && !raw ? ":" : "",
+                              raw ? " " : "\n");
                if (metrics)
                        metricgroup__print_strlist(me->metrics, raw);
                next = rb_next(node);
-- 
2.16.4

Reply via email to