aboutsummaryrefslogtreecommitdiffstats
path: root/tools/lib
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung.kim@lge.com>2012-08-22 03:00:29 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2012-08-22 15:02:59 -0400
commitbffddffde7f9bd093909235a25dbb806fe639dde (patch)
tree9e290ae4cddff7ae48fa20e1f3312ebcdd418ab4 /tools/lib
parentfd34f0b26c9d0f3c3c5c5f83207efa6324cd19f7 (diff)
tools lib traceevent: Introduce pevent_errno
Define and use error numbers for pevent_parse_event() and get rid of die() and do_warning() calls. If the function returns non-zero value, the caller can check the return code and do appropriate things. I chose the error numbers to be negative not to clash with standard errno, and as usual, 0 for success. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Acked-by: Steven Rostedt <rostedt@goodmis.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Steven Rostedt <rostedt@goodmis.org> Link: http://lkml.kernel.org/r/1345618831-9148-3-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/lib')
-rw-r--r--tools/lib/traceevent/event-parse.c50
-rw-r--r--tools/lib/traceevent/event-parse.h26
2 files changed, 54 insertions, 22 deletions
diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
index 33fcd943f09..a46cae701db 100644
--- a/tools/lib/traceevent/event-parse.c
+++ b/tools/lib/traceevent/event-parse.c
@@ -4686,9 +4686,8 @@ static int find_event_handle(struct pevent *pevent, struct event_format *event)
4686 * 4686 *
4687 * /sys/kernel/debug/tracing/events/.../.../format 4687 * /sys/kernel/debug/tracing/events/.../.../format
4688 */ 4688 */
4689int pevent_parse_event(struct pevent *pevent, 4689enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
4690 const char *buf, unsigned long size, 4690 unsigned long size, const char *sys)
4691 const char *sys)
4692{ 4691{
4693 struct event_format *event; 4692 struct event_format *event;
4694 int ret; 4693 int ret;
@@ -4697,17 +4696,16 @@ int pevent_parse_event(struct pevent *pevent,
4697 4696
4698 event = alloc_event(); 4697 event = alloc_event();
4699 if (!event) 4698 if (!event)
4700 return -ENOMEM; 4699 return PEVENT_ERRNO__MEM_ALLOC_FAILED;
4701 4700
4702 event->name = event_read_name(); 4701 event->name = event_read_name();
4703 if (!event->name) { 4702 if (!event->name) {
4704 /* Bad event? */ 4703 /* Bad event? */
4705 free(event); 4704 ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
4706 return -1; 4705 goto event_alloc_failed;
4707 } 4706 }
4708 4707
4709 if (strcmp(sys, "ftrace") == 0) { 4708 if (strcmp(sys, "ftrace") == 0) {
4710
4711 event->flags |= EVENT_FL_ISFTRACE; 4709 event->flags |= EVENT_FL_ISFTRACE;
4712 4710
4713 if (strcmp(event->name, "bprint") == 0) 4711 if (strcmp(event->name, "bprint") == 0)
@@ -4715,20 +4713,28 @@ int pevent_parse_event(struct pevent *pevent,
4715 } 4713 }
4716 4714
4717 event->id = event_read_id(); 4715 event->id = event_read_id();
4718 if (event->id < 0) 4716 if (event->id < 0) {
4719 die("failed to read event id"); 4717 ret = PEVENT_ERRNO__READ_ID_FAILED;
4718 /*
4719 * This isn't an allocation error actually.
4720 * But as the ID is critical, just bail out.
4721 */
4722 goto event_alloc_failed;
4723 }
4720 4724
4721 event->system = strdup(sys); 4725 event->system = strdup(sys);
4722 if (!event->system) 4726 if (!event->system) {
4723 die("failed to allocate system"); 4727 ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
4728 goto event_alloc_failed;
4729 }
4724 4730
4725 /* Add pevent to event so that it can be referenced */ 4731 /* Add pevent to event so that it can be referenced */
4726 event->pevent = pevent; 4732 event->pevent = pevent;
4727 4733
4728 ret = event_read_format(event); 4734 ret = event_read_format(event);
4729 if (ret < 0) { 4735 if (ret < 0) {
4730 do_warning("failed to read event format for %s", event->name); 4736 ret = PEVENT_ERRNO__READ_FORMAT_FAILED;
4731 goto event_failed; 4737 goto event_parse_failed;
4732 } 4738 }
4733 4739
4734 /* 4740 /*
@@ -4740,10 +4746,9 @@ int pevent_parse_event(struct pevent *pevent,
4740 4746
4741 ret = event_read_print(event); 4747 ret = event_read_print(event);
4742 if (ret < 0) { 4748 if (ret < 0) {
4743 do_warning("failed to read event print fmt for %s",
4744 event->name);
4745 show_warning = 1; 4749 show_warning = 1;
4746 goto event_failed; 4750 ret = PEVENT_ERRNO__READ_PRINT_FAILED;
4751 goto event_parse_failed;
4747 } 4752 }
4748 show_warning = 1; 4753 show_warning = 1;
4749 4754
@@ -4760,10 +4765,9 @@ int pevent_parse_event(struct pevent *pevent,
4760 arg->type = PRINT_FIELD; 4765 arg->type = PRINT_FIELD;
4761 arg->field.name = strdup(field->name); 4766 arg->field.name = strdup(field->name);
4762 if (!arg->field.name) { 4767 if (!arg->field.name) {
4763 do_warning("failed to allocate field name");
4764 event->flags |= EVENT_FL_FAILED; 4768 event->flags |= EVENT_FL_FAILED;
4765 free_arg(arg); 4769 free_arg(arg);
4766 return -1; 4770 return PEVENT_ERRNO__OLD_FTRACE_ARG_FAILED;
4767 } 4771 }
4768 arg->field.field = field; 4772 arg->field.field = field;
4769 *list = arg; 4773 *list = arg;
@@ -4778,11 +4782,17 @@ int pevent_parse_event(struct pevent *pevent,
4778 4782
4779 return 0; 4783 return 0;
4780 4784
4781 event_failed: 4785 event_parse_failed:
4782 event->flags |= EVENT_FL_FAILED; 4786 event->flags |= EVENT_FL_FAILED;
4783 /* still add it even if it failed */ 4787 /* still add it even if it failed */
4784 add_event(pevent, event); 4788 add_event(pevent, event);
4785 return -1; 4789 return ret;
4790
4791 event_alloc_failed:
4792 free(event->system);
4793 free(event->name);
4794 free(event);
4795 return ret;
4786} 4796}
4787 4797
4788int get_field_val(struct trace_seq *s, struct format_field *field, 4798int get_field_val(struct trace_seq *s, struct format_field *field,
diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h
index 5772ad8cb38..3c48229a7bc 100644
--- a/tools/lib/traceevent/event-parse.h
+++ b/tools/lib/traceevent/event-parse.h
@@ -345,6 +345,28 @@ enum pevent_flag {
345 PEVENT_NSEC_OUTPUT = 1, /* output in NSECS */ 345 PEVENT_NSEC_OUTPUT = 1, /* output in NSECS */
346}; 346};
347 347
348enum pevent_errno {
349 PEVENT_ERRNO__SUCCESS = 0,
350
351 /*
352 * Choose an arbitrary negative big number not to clash with standard
353 * errno since SUS requires the errno has distinct positive values.
354 * See 'Issue 6' in the link below.
355 *
356 * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
357 */
358 __PEVENT_ERRNO__START = -100000,
359
360 PEVENT_ERRNO__MEM_ALLOC_FAILED = __PEVENT_ERRNO__START,
361 PEVENT_ERRNO__PARSE_EVENT_FAILED,
362 PEVENT_ERRNO__READ_ID_FAILED,
363 PEVENT_ERRNO__READ_FORMAT_FAILED,
364 PEVENT_ERRNO__READ_PRINT_FAILED,
365 PEVENT_ERRNO__OLD_FTRACE_ARG_FAILED,
366
367 __PEVENT_ERRNO__END,
368};
369
348struct cmdline; 370struct cmdline;
349struct cmdline_list; 371struct cmdline_list;
350struct func_map; 372struct func_map;
@@ -509,8 +531,8 @@ void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
509int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size, 531int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size,
510 int long_size); 532 int long_size);
511 533
512int pevent_parse_event(struct pevent *pevent, const char *buf, 534enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
513 unsigned long size, const char *sys); 535 unsigned long size, const char *sys);
514 536
515void *pevent_get_field_raw(struct trace_seq *s, struct event_format *event, 537void *pevent_get_field_raw(struct trace_seq *s, struct event_format *event,
516 const char *name, struct pevent_record *record, 538 const char *name, struct pevent_record *record,