]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
perf tools: Factor out feature op to process header sections
authorRobert Richter <robert.richter@amd.com>
Fri, 9 Dec 2011 14:51:22 +0000 (15:51 +0100)
committerRobert Richter <robert.richter@amd.com>
Thu, 15 Dec 2011 14:17:22 +0000 (15:17 +0100)
There is individual code for each feature to process header sections.
Adding a function pointer .process to struct feature_ops for keeping
the implementation in separate functions. Code to process header
sections is now a generic function.

Signed-off-by: Robert Richter <robert.richter@amd.com>
tools/perf/util/header.c

index 65cfabc89cae3c6630d84fdd8d9fbdd889f8275d..1e38c108449648d60c25a20ffc0fd38bc7795dbd 100644 (file)
@@ -1455,25 +1455,48 @@ out:
        return err;
 }
 
+static int process_trace_info(struct perf_file_section *section __unused,
+                             struct perf_header *ph __unused,
+                             int feat __unused, int fd)
+{
+       trace_report(fd, false);
+       return 0;
+}
+
+static int process_build_id(struct perf_file_section *section,
+                           struct perf_header *ph,
+                           int feat __unused, int fd)
+{
+       if (perf_header__read_build_ids(ph, fd, section->offset, section->size))
+               pr_debug("Failed to read buildids, continuing...\n");
+       return 0;
+}
+
 struct feature_ops {
        int (*write)(int fd, struct perf_header *h, struct perf_evlist *evlist);
        void (*print)(struct perf_header *h, int fd, FILE *fp);
+       int (*process)(struct perf_file_section *section,
+                      struct perf_header *h, int feat, int fd);
        const char *name;
        bool full_only;
 };
 
 #define FEAT_OPA(n, func) \
        [n] = { .name = #n, .write = write_##func, .print = print_##func }
+#define FEAT_OPP(n, func) \
+       [n] = { .name = #n, .write = write_##func, .print = print_##func, \
+               .process = process_##func }
 #define FEAT_OPF(n, func) \
-       [n] = { .name = #n, .write = write_##func, .print = print_##func, .full_only = true }
+       [n] = { .name = #n, .write = write_##func, .print = print_##func, \
+               .full_only = true }
 
 /* feature_ops not implemented: */
 #define print_trace_info               NULL
 #define print_build_id                 NULL
 
 static const struct feature_ops feat_ops[HEADER_LAST_FEATURE] = {
-       FEAT_OPA(HEADER_TRACE_INFO,     trace_info),
-       FEAT_OPA(HEADER_BUILD_ID,       build_id),
+       FEAT_OPP(HEADER_TRACE_INFO,     trace_info),
+       FEAT_OPP(HEADER_BUILD_ID,       build_id),
        FEAT_OPA(HEADER_HOSTNAME,       hostname),
        FEAT_OPA(HEADER_OSRELEASE,      osrelease),
        FEAT_OPA(HEADER_VERSION,        version),
@@ -1857,19 +1880,10 @@ static int perf_file_section__process(struct perf_file_section *section,
                return 0;
        }
 
-       switch (feat) {
-       case HEADER_TRACE_INFO:
-               trace_report(fd, false);
-               break;
-       case HEADER_BUILD_ID:
-               if (perf_header__read_build_ids(ph, fd, section->offset, section->size))
-                       pr_debug("Failed to read buildids, continuing...\n");
-               break;
-       default:
-               break;
-       }
+       if (!feat_ops[feat].process)
+               return 0;
 
-       return 0;
+       return feat_ops[feat].process(section, ph, feat, fd);
 }
 
 static int perf_file_header__read_pipe(struct perf_pipe_file_header *header,