Commit-ID:  1e6d53223884225f0c3f9f1a3ac54a224d97ab24
Gitweb:     http://git.kernel.org/tip/1e6d53223884225f0c3f9f1a3ac54a224d97ab24
Author:     David Ahern <dsah...@gmail.com>
AuthorDate: Sun, 26 Aug 2012 12:24:42 -0600
Committer:  Arnaldo Carvalho de Melo <a...@redhat.com>
CommitDate: Wed, 5 Sep 2012 17:17:30 -0300

perf tool: handle errors in synthesized event functions

Handle error from process callback and propagate back to caller.

Cc: Frederic Weisbecker <fweis...@gmail.com>
Cc: Ingo Molnar <mi...@kernel.org>
Cc: Peter Zijlstra <pet...@infradead.org>
Link: 
http://lkml.kernel.org/r/1346005487-62961-3-git-send-email-dsah...@gmail.com
Signed-off-by: David Ahern <dsah...@gmail.com>
Signed-off-by: Arnaldo Carvalho de Melo <a...@redhat.com>
---
 tools/perf/util/event.c |   35 ++++++++++++++++++++++++++---------
 1 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index 3a0f1a5..84ff6f16 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -120,7 +120,9 @@ static pid_t perf_event__synthesize_comm(struct perf_tool 
*tool,
        if (!full) {
                event->comm.tid = pid;
 
-               process(tool, event, &synth_sample, machine);
+               if (process(tool, event, &synth_sample, machine) != 0)
+                       return -1;
+
                goto out;
        }
 
@@ -151,7 +153,10 @@ static pid_t perf_event__synthesize_comm(struct perf_tool 
*tool,
 
                event->comm.tid = pid;
 
-               process(tool, event, &synth_sample, machine);
+               if (process(tool, event, &synth_sample, machine) != 0) {
+                       tgid = -1;
+                       break;
+               }
        }
 
        closedir(tasks);
@@ -167,6 +172,7 @@ static int perf_event__synthesize_mmap_events(struct 
perf_tool *tool,
 {
        char filename[PATH_MAX];
        FILE *fp;
+       int rc = 0;
 
        snprintf(filename, sizeof(filename), "/proc/%d/maps", pid);
 
@@ -231,18 +237,22 @@ static int perf_event__synthesize_mmap_events(struct 
perf_tool *tool,
                        event->mmap.pid = tgid;
                        event->mmap.tid = pid;
 
-                       process(tool, event, &synth_sample, machine);
+                       if (process(tool, event, &synth_sample, machine) != 0) {
+                               rc = -1;
+                               break;
+                       }
                }
        }
 
        fclose(fp);
-       return 0;
+       return rc;
 }
 
 int perf_event__synthesize_modules(struct perf_tool *tool,
                                   perf_event__handler_t process,
                                   struct machine *machine)
 {
+       int rc = 0;
        struct rb_node *nd;
        struct map_groups *kmaps = &machine->kmaps;
        union perf_event *event = zalloc((sizeof(event->mmap) +
@@ -284,11 +294,14 @@ int perf_event__synthesize_modules(struct perf_tool *tool,
 
                memcpy(event->mmap.filename, pos->dso->long_name,
                       pos->dso->long_name_len + 1);
-               process(tool, event, &synth_sample, machine);
+               if (process(tool, event, &synth_sample, machine) != 0) {
+                       rc = -1;
+                       break;
+               }
        }
 
        free(event);
-       return 0;
+       return rc;
 }
 
 static int __event__synthesize_thread(union perf_event *comm_event,
@@ -392,12 +405,16 @@ int perf_event__synthesize_threads(struct perf_tool *tool,
                if (*end) /* only interested in proper numerical dirents */
                        continue;
 
-               __event__synthesize_thread(comm_event, mmap_event, pid, 1,
-                                          process, tool, machine);
+               if (__event__synthesize_thread(comm_event, mmap_event, pid, 1,
+                                          process, tool, machine) != 0) {
+                       err = -1;
+                       goto out_closedir;
+               }
        }
 
-       closedir(proc);
        err = 0;
+out_closedir:
+       closedir(proc);
 out_free_mmap:
        free(mmap_event);
 out_free_comm:
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to