tools lib traceevent: Factor out and export print_event_field[s]()
authorNamhyung Kim <namhyung@kernel.org>
Wed, 23 Dec 2015 13:08:41 +0000 (22:08 +0900)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 6 Jan 2016 23:11:11 +0000 (20:11 -0300)
The print_event_field() and print_event_fields() functions print basic
information of a given field or event without the print format.  They'll
be used by dynamic sort keys later.

Committer note:

Rename it to pevent_print_field[s]() to get proper namespacing, as
discussed with Steven Rostedt.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1450876121-22494-1-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/lib/traceevent/event-parse.c
tools/lib/traceevent/event-parse.h

index 68276f3..ea69ce3 100644 (file)
@@ -4735,73 +4735,80 @@ static int is_printable_array(char *p, unsigned int len)
        return 1;
 }
 
-static void print_event_fields(struct trace_seq *s, void *data,
-                              int size __maybe_unused,
-                              struct event_format *event)
+void pevent_print_field(struct trace_seq *s, void *data,
+                       struct format_field *field)
 {
-       struct format_field *field;
        unsigned long long val;
        unsigned int offset, len, i;
-
-       field = event->format.fields;
-       while (field) {
-               trace_seq_printf(s, " %s=", field->name);
-               if (field->flags & FIELD_IS_ARRAY) {
-                       offset = field->offset;
-                       len = field->size;
-                       if (field->flags & FIELD_IS_DYNAMIC) {
-                               val = pevent_read_number(event->pevent, data + offset, len);
-                               offset = val;
-                               len = offset >> 16;
-                               offset &= 0xffff;
-                       }
-                       if (field->flags & FIELD_IS_STRING &&
-                           is_printable_array(data + offset, len)) {
-                               trace_seq_printf(s, "%s", (char *)data + offset);
-                       } else {
-                               trace_seq_puts(s, "ARRAY[");
-                               for (i = 0; i < len; i++) {
-                                       if (i)
-                                               trace_seq_puts(s, ", ");
-                                       trace_seq_printf(s, "%02x",
-                                                        *((unsigned char *)data + offset + i));
-                               }
-                               trace_seq_putc(s, ']');
-                               field->flags &= ~FIELD_IS_STRING;
-                       }
+       struct pevent *pevent = field->event->pevent;
+
+       if (field->flags & FIELD_IS_ARRAY) {
+               offset = field->offset;
+               len = field->size;
+               if (field->flags & FIELD_IS_DYNAMIC) {
+                       val = pevent_read_number(pevent, data + offset, len);
+                       offset = val;
+                       len = offset >> 16;
+                       offset &= 0xffff;
+               }
+               if (field->flags & FIELD_IS_STRING &&
+                   is_printable_array(data + offset, len)) {
+                       trace_seq_printf(s, "%s", (char *)data + offset);
                } else {
-                       val = pevent_read_number(event->pevent, data + field->offset,
-                                                field->size);
-                       if (field->flags & FIELD_IS_POINTER) {
-                               trace_seq_printf(s, "0x%llx", val);
-                       } else if (field->flags & FIELD_IS_SIGNED) {
-                               switch (field->size) {
-                               case 4:
-                                       /*
-                                        * If field is long then print it in hex.
-                                        * A long usually stores pointers.
-                                        */
-                                       if (field->flags & FIELD_IS_LONG)
-                                               trace_seq_printf(s, "0x%x", (int)val);
-                                       else
-                                               trace_seq_printf(s, "%d", (int)val);
-                                       break;
-                               case 2:
-                                       trace_seq_printf(s, "%2d", (short)val);
-                                       break;
-                               case 1:
-                                       trace_seq_printf(s, "%1d", (char)val);
-                                       break;
-                               default:
-                                       trace_seq_printf(s, "%lld", val);
-                               }
-                       } else {
+                       trace_seq_puts(s, "ARRAY[");
+                       for (i = 0; i < len; i++) {
+                               if (i)
+                                       trace_seq_puts(s, ", ");
+                               trace_seq_printf(s, "%02x",
+                                                *((unsigned char *)data + offset + i));
+                       }
+                       trace_seq_putc(s, ']');
+                       field->flags &= ~FIELD_IS_STRING;
+               }
+       } else {
+               val = pevent_read_number(pevent, data + field->offset,
+                                        field->size);
+               if (field->flags & FIELD_IS_POINTER) {
+                       trace_seq_printf(s, "0x%llx", val);
+               } else if (field->flags & FIELD_IS_SIGNED) {
+                       switch (field->size) {
+                       case 4:
+                               /*
+                                * If field is long then print it in hex.
+                                * A long usually stores pointers.
+                                */
                                if (field->flags & FIELD_IS_LONG)
-                                       trace_seq_printf(s, "0x%llx", val);
+                                       trace_seq_printf(s, "0x%x", (int)val);
                                else
-                                       trace_seq_printf(s, "%llu", val);
+                                       trace_seq_printf(s, "%d", (int)val);
+                               break;
+                       case 2:
+                               trace_seq_printf(s, "%2d", (short)val);
+                               break;
+                       case 1:
+                               trace_seq_printf(s, "%1d", (char)val);
+                               break;
+                       default:
+                               trace_seq_printf(s, "%lld", val);
                        }
+               } else {
+                       if (field->flags & FIELD_IS_LONG)
+                               trace_seq_printf(s, "0x%llx", val);
+                       else
+                               trace_seq_printf(s, "%llu", val);
                }
+       }
+}
+
+void pevent_print_fields(struct trace_seq *s, void *data,
+                        int size __maybe_unused, struct event_format *event)
+{
+       struct format_field *field;
+
+       field = event->format.fields;
+       while (field) {
+               trace_seq_printf(s, " %s=", field->name);
+               pevent_print_field(s, data, field);
                field = field->next;
        }
 }
@@ -4827,7 +4834,7 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event
 
        if (event->flags & EVENT_FL_FAILED) {
                trace_seq_printf(s, "[FAILED TO PARSE]");
-               print_event_fields(s, data, size, event);
+               pevent_print_fields(s, data, size, event);
                return;
        }
 
@@ -5301,7 +5308,7 @@ void pevent_event_info(struct trace_seq *s, struct event_format *event,
        int print_pretty = 1;
 
        if (event->pevent->print_raw || (event->flags & EVENT_FL_PRINTRAW))
-               print_event_fields(s, record->data, record->size, event);
+               pevent_print_fields(s, record->data, record->size, event);
        else {
 
                if (event->handler && !(event->flags & EVENT_FL_NOHANDLE))
index 6fc83c7..706d9bc 100644 (file)
@@ -705,6 +705,10 @@ struct cmdline *pevent_data_pid_from_comm(struct pevent *pevent, const char *com
                                          struct cmdline *next);
 int pevent_cmdline_pid(struct pevent *pevent, struct cmdline *cmdline);
 
+void pevent_print_field(struct trace_seq *s, void *data,
+                       struct format_field *field);
+void pevent_print_fields(struct trace_seq *s, void *data,
+                        int size __maybe_unused, struct event_format *event);
 void pevent_event_info(struct trace_seq *s, struct event_format *event,
                       struct pevent_record *record);
 int pevent_strerror(struct pevent *pevent, enum pevent_errno errnum,