From: "Yordan Karadzhov (VMware)" <y.karadz@gmail.com>
To: rostedt@goodmis.org
Cc: linux-trace-devel@vger.kernel.org,
"Yordan Karadzhov (VMware)" <y.karadz@gmail.com>
Subject: [PATCH v4 3/5] libtraceevent: Improve tep_print_field()
Date: Tue, 10 Aug 2021 15:26:57 +0300 [thread overview]
Message-ID: <20210810122659.145759-4-y.karadz@gmail.com> (raw)
In-Reply-To: <20210810122659.145759-1-y.karadz@gmail.com>
The existing method tep_print_fields() gets upgraded to use the
printing formats provided by the tokens.
Suggested-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
---
src/event-parse.c | 118 +++++++++++++++++++++++++++++++++++-----------
1 file changed, 90 insertions(+), 28 deletions(-)
diff --git a/src/event-parse.c b/src/event-parse.c
index 1a8cc54..4b5e98b 100644
--- a/src/event-parse.c
+++ b/src/event-parse.c
@@ -3913,7 +3913,6 @@ eval_num_arg(void *data, int size, struct tep_event *event, struct tep_print_arg
arg->field.field = tep_find_any_field(event, arg->field.name);
if (!arg->field.field)
goto out_warning_field;
-
}
/* must be a number */
val = tep_read_number(tep, data + arg->field.field->offset,
@@ -5326,8 +5325,8 @@ static int is_printable_array(char *p, unsigned int len)
return 1;
}
-void tep_print_field(struct trace_seq *s, void *data,
- struct tep_format_field *field)
+static void tep_print_field_raw(struct trace_seq *s, void *data,
+ struct tep_format_field *field)
{
struct tep_handle *tep = field->event->tep;
unsigned int offset, len, i;
@@ -5390,6 +5389,59 @@ void tep_print_field(struct trace_seq *s, void *data,
}
}
+static int print_parse_data(struct tep_print_parse *parse, struct trace_seq *s,
+ void *data, int size, struct tep_event *event);
+
+void tep_print_field(struct trace_seq *s, void *data,
+ struct tep_format_field *field)
+{
+ struct tep_event *event = field->event;
+ struct tep_print_parse *parse;
+ bool has_0x;
+
+ parse = event->print_fmt.print_cache;
+
+ if (event->flags & TEP_EVENT_FL_FAILED)
+ goto out;
+
+ if (field->flags & (TEP_FIELD_IS_ARRAY || TEP_FIELD_IS_STRING))
+ goto out;
+
+ for (;parse; parse = parse->next) {
+ if (parse->type == PRINT_FMT_STRING) {
+ int len = strlen(parse->format);
+
+ if (len > 1 &&
+ strcmp(parse->format + (len -2), "0x") == 0)
+ has_0x = true;
+ else
+ has_0x = false;
+
+ continue;
+ }
+
+ if (!parse->arg ||
+ parse->arg->type != TEP_PRINT_FIELD ||
+ parse->arg->field.field != field) {
+ has_0x = false;
+ continue;
+ }
+
+ if (has_0x)
+ trace_seq_puts(s, "0x");
+
+ print_parse_data(parse, s,
+ data + field->offset,
+ field->size,
+ event);
+ return;
+ }
+
+ out:
+ /* Not found. */
+ tep_print_field_raw(s, data, field);
+}
+
void tep_print_fields(struct trace_seq *s, void *data,
int size __maybe_unused, struct tep_event *event)
{
@@ -5909,35 +5961,45 @@ parse_args(struct tep_event *event, const char *format, struct tep_print_arg *ar
return parse_ret;
}
-static void print_event_cache(struct tep_print_parse *parse, struct trace_seq *s,
- void *data, int size, struct tep_event *event)
+static int print_parse_data(struct tep_print_parse *parse, struct trace_seq *s,
+ void *data, int size, struct tep_event *event)
{
int len_arg;
+ if (parse->len_as_arg)
+ len_arg = eval_num_arg(data, size, event, parse->len_as_arg);
+
+ switch (parse->type) {
+ case PRINT_FMT_ARG_DIGIT:
+ print_arg_number(s, parse->format,
+ parse->len_as_arg ? len_arg : -1, data,
+ size, parse->ls, event, parse->arg);
+ break;
+ case PRINT_FMT_ARG_POINTER:
+ print_arg_pointer(s, parse->format,
+ parse->len_as_arg ? len_arg : 1,
+ data, size, event, parse->arg);
+ break;
+ case PRINT_FMT_ARG_STRING:
+ print_arg_string(s, parse->format,
+ parse->len_as_arg ? len_arg : -1,
+ data, size, event, parse->arg);
+ break;
+ case PRINT_FMT_STRING:
+ default:
+ trace_seq_printf(s, "%s", parse->format);
+ /* Return 1 on non field. */
+ return 1;
+ }
+ /* Return 0 on field being processed. */
+ return 0;
+}
+
+static void print_event_cache(struct tep_print_parse *parse, struct trace_seq *s,
+ void *data, int size, struct tep_event *event)
+{
while (parse) {
- if (parse->len_as_arg)
- len_arg = eval_num_arg(data, size, event, parse->len_as_arg);
- switch (parse->type) {
- case PRINT_FMT_ARG_DIGIT:
- print_arg_number(s, parse->format,
- parse->len_as_arg ? len_arg : -1, data,
- size, parse->ls, event, parse->arg);
- break;
- case PRINT_FMT_ARG_POINTER:
- print_arg_pointer(s, parse->format,
- parse->len_as_arg ? len_arg : 1,
- data, size, event, parse->arg);
- break;
- case PRINT_FMT_ARG_STRING:
- print_arg_string(s, parse->format,
- parse->len_as_arg ? len_arg : -1,
- data, size, event, parse->arg);
- break;
- case PRINT_FMT_STRING:
- default:
- trace_seq_printf(s, "%s", parse->format);
- break;
- }
+ print_parse_data(parse, s, data, size, event);
parse = parse->next;
}
}
--
2.30.2
next prev parent reply other threads:[~2021-08-10 12:27 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-10 12:26 [PATCH v4 0/5] libtraceevent: Optimize the print of tep fields Yordan Karadzhov (VMware)
2021-08-10 12:26 ` [PATCH v4 1/5] libtraceevent: Add dynamic_offset() Yordan Karadzhov (VMware)
2021-08-10 12:26 ` [PATCH v4 2/5] libtraceevent: Have all field args point to the field they represent Yordan Karadzhov (VMware)
2021-08-10 12:26 ` Yordan Karadzhov (VMware) [this message]
2021-08-10 12:26 ` [PATCH v4 4/5] libtraceevent: Optimize tep_print_fields() Yordan Karadzhov (VMware)
2021-08-10 12:26 ` [PATCH v4 5/5] libtraceevent: Add tep_print_selected_fields() Yordan Karadzhov (VMware)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210810122659.145759-4-y.karadz@gmail.com \
--to=y.karadz@gmail.com \
--cc=linux-trace-devel@vger.kernel.org \
--cc=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).