aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/header.c
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2009-11-16 22:18:12 -0500
committerIngo Molnar <mingo@elte.hu>2009-11-17 01:19:56 -0500
commit3726cc75e581c157202da93bb2333cce25c15c98 (patch)
tree335083c02f999a6d4e0062b827c3a94f0f8f1e36 /tools/perf/util/header.c
parenta9a70bbce7ab0bf3b1cba3ac662c4d502da6305c (diff)
perf tools: Don't die() in do_write()
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-4-git-send-email-acme@infradead.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools/perf/util/header.c')
-rw-r--r--tools/perf/util/header.c33
1 files changed, 22 insertions, 11 deletions
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 726a0eb5f19..b01a9537977 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -161,31 +161,36 @@ bool perf_header__has_feat(const struct perf_header *self, int feat)
161 return test_bit(feat, self->adds_features); 161 return test_bit(feat, self->adds_features);
162} 162}
163 163
164static void do_write(int fd, void *buf, size_t size) 164static int do_write(int fd, const void *buf, size_t size)
165{ 165{
166 while (size) { 166 while (size) {
167 int ret = write(fd, buf, size); 167 int ret = write(fd, buf, size);
168 168
169 if (ret < 0) 169 if (ret < 0)
170 die("failed to write"); 170 return -1;
171 171
172 size -= ret; 172 size -= ret;
173 buf += ret; 173 buf += ret;
174 } 174 }
175
176 return 0;
175} 177}
176 178
177static void write_buildid_table(int fd, struct list_head *id_head) 179static int write_buildid_table(int fd, struct list_head *id_head)
178{ 180{
179 struct build_id_list *iter, *next; 181 struct build_id_list *iter, *next;
180 182
181 list_for_each_entry_safe(iter, next, id_head, list) { 183 list_for_each_entry_safe(iter, next, id_head, list) {
182 struct build_id_event *b = &iter->event; 184 struct build_id_event *b = &iter->event;
183 185
184 do_write(fd, b, sizeof(*b)); 186 if (do_write(fd, b, sizeof(*b)) < 0 ||
185 do_write(fd, (void *)iter->dso_name, iter->len); 187 do_write(fd, iter->dso_name, iter->len) < 0)
188 return -1;
186 list_del(&iter->list); 189 list_del(&iter->list);
187 free(iter); 190 free(iter);
188 } 191 }
192
193 return 0;
189} 194}
190 195
191static void 196static void
@@ -233,12 +238,14 @@ perf_header__adds_write(struct perf_header *self, int fd)
233 238
234 /* Write build-ids */ 239 /* Write build-ids */
235 buildid_sec->offset = lseek(fd, 0, SEEK_CUR); 240 buildid_sec->offset = lseek(fd, 0, SEEK_CUR);
236 write_buildid_table(fd, &id_list); 241 if (write_buildid_table(fd, &id_list) < 0)
242 die("failed to write buildid table");
237 buildid_sec->size = lseek(fd, 0, SEEK_CUR) - buildid_sec->offset; 243 buildid_sec->size = lseek(fd, 0, SEEK_CUR) - buildid_sec->offset;
238 } 244 }
239 245
240 lseek(fd, sec_start, SEEK_SET); 246 lseek(fd, sec_start, SEEK_SET);
241 do_write(fd, feat_sec, sec_size); 247 if (do_write(fd, feat_sec, sec_size) < 0)
248 die("failed to write feature section");
242 free(feat_sec); 249 free(feat_sec);
243} 250}
244 251
@@ -256,7 +263,8 @@ void perf_header__write(struct perf_header *self, int fd, bool at_exit)
256 attr = self->attr[i]; 263 attr = self->attr[i];
257 264
258 attr->id_offset = lseek(fd, 0, SEEK_CUR); 265 attr->id_offset = lseek(fd, 0, SEEK_CUR);
259 do_write(fd, attr->id, attr->ids * sizeof(u64)); 266 if (do_write(fd, attr->id, attr->ids * sizeof(u64)) < 0)
267 die("failed to write perf header");
260 } 268 }
261 269
262 270
@@ -272,13 +280,15 @@ void perf_header__write(struct perf_header *self, int fd, bool at_exit)
272 .size = attr->ids * sizeof(u64), 280 .size = attr->ids * sizeof(u64),
273 } 281 }
274 }; 282 };
275 do_write(fd, &f_attr, sizeof(f_attr)); 283 if (do_write(fd, &f_attr, sizeof(f_attr)) < 0)
284 die("failed to write perf header attribute");
276 } 285 }
277 286
278 self->event_offset = lseek(fd, 0, SEEK_CUR); 287 self->event_offset = lseek(fd, 0, SEEK_CUR);
279 self->event_size = event_count * sizeof(struct perf_trace_event_type); 288 self->event_size = event_count * sizeof(struct perf_trace_event_type);
280 if (events) 289 if (events)
281 do_write(fd, events, self->event_size); 290 if (do_write(fd, events, self->event_size) < 0)
291 die("failed to write perf header events");
282 292
283 self->data_offset = lseek(fd, 0, SEEK_CUR); 293 self->data_offset = lseek(fd, 0, SEEK_CUR);
284 294
@@ -306,7 +316,8 @@ void perf_header__write(struct perf_header *self, int fd, bool at_exit)
306 memcpy(&f_header.adds_features, &self->adds_features, sizeof(self->adds_features)); 316 memcpy(&f_header.adds_features, &self->adds_features, sizeof(self->adds_features));
307 317
308 lseek(fd, 0, SEEK_SET); 318 lseek(fd, 0, SEEK_SET);
309 do_write(fd, &f_header, sizeof(f_header)); 319 if (do_write(fd, &f_header, sizeof(f_header)) < 0)
320 die("failed to write perf header");
310 lseek(fd, self->data_offset + self->data_size, SEEK_SET); 321 lseek(fd, self->data_offset + self->data_size, SEEK_SET);
311 322
312 self->frozen = 1; 323 self->frozen = 1;