libtraceevent(3)
================

NAME
----
tep_data_type, tep_data_pid,tep_data_preempt_count, tep_data_flags -
Extract common fields from a record.

SYNOPSIS
--------
[verse]
--
*#include <event-parse.h>*

enum *trace_flag_type* {
	_TRACE_FLAG_IRQS_OFF_,
	_TRACE_FLAG_IRQS_NOSUPPORT_,
	_TRACE_FLAG_NEED_RESCHED_,
	_TRACE_FLAG_HARDIRQ_,
	_TRACE_FLAG_SOFTIRQ_,
};

int *tep_data_type*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
int *tep_data_pid*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
int *tep_data_preempt_count*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
int *tep_data_flags*(struct tep_handle pass:[*]_tep_, struct tep_record pass:[*]_rec_);
--

DESCRIPTION
-----------
This set of functions can be used to extract common fields from a record.

The _tep_data_type()_ function gets the event id from the record _rec_.
It reads the "common_type" field. The _tep_ argument is the trace event parser
context.

The _tep_data_pid()_ function gets the process id from the record _rec_.
It reads the "common_pid" field. The _tep_ argument is the trace event parser
context.

The _tep_data_preempt_count()_ function gets the preemption count from the
record _rec_. It reads the "common_preempt_count" field. The _tep_ argument is
the trace event parser context.

The _tep_data_flags()_ function gets the latency flags from the record _rec_.
It reads the "common_flags" field. The _tep_ argument is the trace event parser
context. Supported latency flags are:
[verse]
--
	_TRACE_FLAG_IRQS_OFF_,		Interrupts are disabled.
	_TRACE_FLAG_IRQS_NOSUPPORT_,	Reading IRQ flag is not supported by the architecture.
	_TRACE_FLAG_NEED_RESCHED_,	Task needs rescheduling.
	_TRACE_FLAG_HARDIRQ_,		Hard IRQ is running.
	_TRACE_FLAG_SOFTIRQ_,		Soft IRQ is running.
--

RETURN VALUE
------------
The _tep_data_type()_ function returns an integer, representing the event id.

The _tep_data_pid()_ function returns an integer, representing the process id

The _tep_data_preempt_count()_ function returns an integer, representing the
preemption count.

The _tep_data_flags()_ function returns an integer, representing the latency
flags. Look at the _trace_flag_type_ enum for supported flags.

All these functions in case of an error return a negative integer.

EXAMPLE
-------
[source,c]
--
#include <event-parse.h>
...
struct tep_handle *tep = tep_alloc();
...
void process_record(struct tep_record *record)
{
	int data;

	data = tep_data_type(tep, record);
	if (data >= 0) {
		/* Got the ID of the event */
	}

	data = tep_data_pid(tep, record);
	if (data >= 0) {
		/* Got the process ID */
	}

	data = tep_data_preempt_count(tep, record);
	if (data >= 0) {
		/* Got the preemption count */
	}

	data = tep_data_flags(tep, record);
	if (data >= 0) {
		/* Got the latency flags */
	}
}
...
--

FILES
-----
[verse]
--
*event-parse.h*
	Header file to include in order to have access to the library APIs.
*-ltraceevent*
	Linker switch to add when building a program that uses the library.
--

SEE ALSO
--------
_libtraceevent(3)_, _trace-cmd(1)_

AUTHOR
------
[verse]
--
*Steven Rostedt* <rostedt@goodmis.org>, author of *libtraceevent*.
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>, author of this man page.
--
REPORTING BUGS
--------------
Report bugs to  <linux-trace-devel@vger.kernel.org>

LICENSE
-------
libtraceevent is Free Software licensed under the GNU LGPL 2.1

RESOURCES
---------
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
