Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a6745330 authored by Steven Rostedt's avatar Steven Rostedt Committed by Arnaldo Carvalho de Melo
Browse files

tools lib traceevent: Split pevent_print_event() into specific functionality functions



Currently there's a single function that is used to display a record's
data in human readable format. That's pevent_print_event().
Unfortunately, this gives little room for adding other output within the
line without updating that function call.

I've decided to split that function into 3 parts.

 pevent_print_event_task() which prints the task comm, pid and the CPU
 pevent_print_event_time() which outputs the record's timestamp
 pevent_print_event_data() which outputs the rest of the event data.

pevent_print_event() now simply calls these three functions.

To save time from doing the search for event from the record's type, I
created a new helper function called pevent_find_event_by_record(),
which returns the record's event, and this event has to be passed to the
above functions.

Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: http://lkml.kernel.org/r/20160229090128.43a56704@gandalf.local.home


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 026842d1
Loading
Loading
Loading
Loading
+104 −32
Original line number Diff line number Diff line
@@ -5339,51 +5339,89 @@ static bool is_timestamp_in_us(char *trace_clock, bool use_trace_clock)
	return false;
}

void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
			struct pevent_record *record, bool use_trace_clock)
/**
 * pevent_find_event_by_record - return the event from a given record
 * @pevent: a handle to the pevent
 * @record: The record to get the event from
 *
 * Returns the associated event for a given record, or NULL if non is
 * is found.
 */
struct event_format *
pevent_find_event_by_record(struct pevent *pevent, struct pevent_record *record)
{
	static const char *spaces = "                    "; /* 20 spaces */
	struct event_format *event;
	unsigned long secs;
	unsigned long usecs;
	unsigned long nsecs;
	const char *comm;
	void *data = record->data;
	int type;
	int pid;
	int len;
	int p;
	bool use_usec_format;

	use_usec_format = is_timestamp_in_us(pevent->trace_clock,
							use_trace_clock);
	if (use_usec_format) {
		secs = record->ts / NSECS_PER_SEC;
		nsecs = record->ts - secs * NSECS_PER_SEC;
	}

	if (record->size < 0) {
		do_warning("ug! negative record size %d", record->size);
		return;
		return NULL;
	}

	type = trace_parse_common_type(pevent, data);
	type = trace_parse_common_type(pevent, record->data);

	event = pevent_find_event(pevent, type);
	if (!event) {
		do_warning("ug! no event found for type %d", type);
		return;
	return pevent_find_event(pevent, type);
}

/**
 * pevent_print_event_task - Write the event task comm, pid and CPU
 * @pevent: a handle to the pevent
 * @s: the trace_seq to write to
 * @event: the handle to the record's event
 * @record: The record to get the event from
 *
 * Writes the tasks comm, pid and CPU to @s.
 */
void pevent_print_event_task(struct pevent *pevent, struct trace_seq *s,
			     struct event_format *event,
			     struct pevent_record *record)
{
	void *data = record->data;
	const char *comm;
	int pid;

	pid = parse_common_pid(pevent, data);
	comm = find_cmdline(pevent, pid);

	if (pevent->latency_format) {
		trace_seq_printf(s, "%8.8s-%-5d %3d",
		       comm, pid, record->cpu);
		pevent_data_lat_fmt(pevent, s, record);
	} else
		trace_seq_printf(s, "%16s-%-5d [%03d]", comm, pid, record->cpu);
}

/**
 * pevent_print_event_time - Write the event timestamp
 * @pevent: a handle to the pevent
 * @s: the trace_seq to write to
 * @event: the handle to the record's event
 * @record: The record to get the event from
 * @use_trace_clock: Set to parse according to the @pevent->trace_clock
 *
 * Writes the timestamp of the record into @s.
 */
void pevent_print_event_time(struct pevent *pevent, struct trace_seq *s,
			     struct event_format *event,
			     struct pevent_record *record,
			     bool use_trace_clock)
{
	unsigned long secs;
	unsigned long usecs;
	unsigned long nsecs;
	int p;
	bool use_usec_format;

	use_usec_format = is_timestamp_in_us(pevent->trace_clock,
							use_trace_clock);
	if (use_usec_format) {
		secs = record->ts / NSECS_PER_SEC;
		nsecs = record->ts - secs * NSECS_PER_SEC;
	}

	if (pevent->latency_format) {
		trace_seq_printf(s, " %3d", record->cpu);
		pevent_data_lat_fmt(pevent, s, record);
	} else
		trace_seq_printf(s, " [%03d]", record->cpu);

	if (use_usec_format) {
		if (pevent->flags & PEVENT_NSEC_OUTPUT) {
@@ -5394,11 +5432,28 @@ void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
			p = 6;
		}

		trace_seq_printf(s, " %5lu.%0*lu: %s: ",
					secs, p, usecs, event->name);
		trace_seq_printf(s, " %5lu.%0*lu:", secs, p, usecs);
	} else
		trace_seq_printf(s, " %12llu: %s: ",
					record->ts, event->name);
		trace_seq_printf(s, " %12llu:", record->ts);
}

/**
 * pevent_print_event_data - Write the event data section
 * @pevent: a handle to the pevent
 * @s: the trace_seq to write to
 * @event: the handle to the record's event
 * @record: The record to get the event from
 *
 * Writes the parsing of the record's data to @s.
 */
void pevent_print_event_data(struct pevent *pevent, struct trace_seq *s,
			     struct event_format *event,
			     struct pevent_record *record)
{
	static const char *spaces = "                    "; /* 20 spaces */
	int len;

	trace_seq_printf(s, " %s: ", event->name);

	/* Space out the event names evenly. */
	len = strlen(event->name);
@@ -5408,6 +5463,23 @@ void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
	pevent_event_info(s, event, record);
}

void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
			struct pevent_record *record, bool use_trace_clock)
{
	struct event_format *event;

	event = pevent_find_event_by_record(pevent, record);
	if (!event) {
		do_warning("ug! no event found for type %d",
			   trace_parse_common_type(pevent, record->data));
		return;
	}

	pevent_print_event_task(pevent, s, event, record);
	pevent_print_event_time(pevent, s, event, record, use_trace_clock);
	pevent_print_event_data(pevent, s, event, record);
}

static int events_id_cmp(const void *a, const void *b)
{
	struct event_format * const * ea = a;
+13 −0
Original line number Diff line number Diff line
@@ -628,6 +628,16 @@ int pevent_register_print_string(struct pevent *pevent, const char *fmt,
				 unsigned long long addr);
int pevent_pid_is_registered(struct pevent *pevent, int pid);

void pevent_print_event_task(struct pevent *pevent, struct trace_seq *s,
			     struct event_format *event,
			     struct pevent_record *record);
void pevent_print_event_time(struct pevent *pevent, struct trace_seq *s,
			     struct event_format *event,
			     struct pevent_record *record,
			     bool use_trace_clock);
void pevent_print_event_data(struct pevent *pevent, struct trace_seq *s,
			     struct event_format *event,
			     struct pevent_record *record);
void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
			struct pevent_record *record, bool use_trace_clock);

@@ -694,6 +704,9 @@ struct event_format *pevent_find_event(struct pevent *pevent, int id);
struct event_format *
pevent_find_event_by_name(struct pevent *pevent, const char *sys, const char *name);

struct event_format *
pevent_find_event_by_record(struct pevent *pevent, struct pevent_record *record);

void pevent_data_lat_fmt(struct pevent *pevent,
			 struct trace_seq *s, struct pevent_record *record);
int pevent_data_type(struct pevent *pevent, struct pevent_record *rec);