perf tools: Don't die() in perf_header_attr__add_id()
authorArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 17 Nov 2009 03:18:10 +0000 (01:18 -0200)
committerIngo Molnar <mingo@elte.hu>
Tue, 17 Nov 2009 06:19:55 +0000 (07:19 +0100)
Propagate the errors instead, the users are the ones to decide
what to do if a library call fails.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
LKML-Reference: <1258427892-16312-2-git-send-email-acme@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
tools/perf/builtin-record.c
tools/perf/util/header.c
tools/perf/util/header.h

index 5411be4cfd77110c60708a92843d31289120f3f5..2a85205ba01ac959cdb91a2ddcfdff7b5ab95f35 100644 (file)
@@ -327,7 +327,10 @@ try_again:
                exit(-1);
        }
 
-       perf_header_attr__add_id(h_attr, read_data.id);
+       if (perf_header_attr__add_id(h_attr, read_data.id) < 0) {
+               pr_warning("Not enough memory to add id\n");
+               exit(-1);
+       }
 
        assert(fd[nr_cpu][counter] >= 0);
        fcntl(fd[nr_cpu][counter], F_SETFL, O_NONBLOCK);
index 23ccddae0b06fceb093b19486e605d4a1cabc1ac..dee1ed2f0d1b7ac2dcdfab41592e7f9f6776718f 100644 (file)
@@ -39,18 +39,23 @@ void perf_header_attr__delete(struct perf_header_attr *self)
        free(self);
 }
 
-void perf_header_attr__add_id(struct perf_header_attr *self, u64 id)
+int perf_header_attr__add_id(struct perf_header_attr *self, u64 id)
 {
        int pos = self->ids;
 
        self->ids++;
        if (self->ids > self->size) {
-               self->size *= 2;
-               self->id = realloc(self->id, self->size * sizeof(u64));
-               if (!self->id)
-                       die("nomem");
+               int nsize = self->size * 2;
+               u64 *nid = realloc(self->id, nsize * sizeof(u64));
+
+               if (nid == NULL)
+                       return -1;
+
+               self->size = nsize;
+               self->id = nid;
        }
        self->id[pos] = id;
+       return 0;
 }
 
 /*
@@ -444,7 +449,8 @@ struct perf_header *perf_header__read(int fd)
                for (j = 0; j < nr_ids; j++) {
                        do_read(fd, &f_id, sizeof(f_id));
 
-                       perf_header_attr__add_id(attr, f_id);
+                       if (perf_header_attr__add_id(attr, f_id) < 0)
+                               die("nomem");
                }
                if (perf_header__add_attr(self, attr) < 0)
                         die("nomem");
index b0d5cd707a7b3a44bd7e77cfed08af331b5b7434..f46a94e09eea9f603b10d2769244a136b525f1a3 100644 (file)
@@ -67,7 +67,7 @@ char *perf_header__find_event(u64 id);
 struct perf_header_attr *perf_header_attr__new(struct perf_event_attr *attr);
 void perf_header_attr__delete(struct perf_header_attr *self);
 
-void perf_header_attr__add_id(struct perf_header_attr *self, u64 id);
+int perf_header_attr__add_id(struct perf_header_attr *self, u64 id);
 
 u64 perf_header__sample_type(struct perf_header *header);
 struct perf_event_attr *