perf tools: Factor out feature op to process header sections
authorRobert Richter <robert.richter@amd.com>
Fri, 10 Feb 2012 14:41:56 +0000 (15:41 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 14 Feb 2012 01:33:36 +0000 (23:33 -0200)
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.

Cc: Ingo Molnar <mingo@elte.hu>
Link: http://lkml.kernel.org/r/1328884916-5901-2-git-send-email-robert.richter@amd.com
Signed-off-by: Robert Richter <robert.richter@amd.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/header.c

index 5bb2d752ab8f4971258172e6c47286f6609bb213..9f867d96c6a5e5587f4ba1478c3ef1cb62a03eb2 100644 (file)
@@ -1466,25 +1466,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),
@@ -1900,19 +1923,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,