libtracefs(3)
=============

NAME
----
tracefs_event_systems, tracefs_system_events, tracefs_iterate_raw_events -
Work with trace systems and events.

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

char pass:[*]pass:[*]*tracefs_event_systems*(const char pass:[*]_tracing_dir_);
char pass:[*]pass:[*]*tracefs_system_events*(const char pass:[*]_tracing_dir_, const char pass:[*]_system_);
int *tracefs_event_enable*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_system_, const char pass:[*]_event_);
int *tracefs_event_disable*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_system_, const char pass:[*]_event_);
int *tracefs_iterate_raw_events*(struct tep_handle pass:[*]_tep_, struct tracefs_instance pass:[*]_instance_, cpu_set_t pass:[*]_cpus_, int _cpu_size_, int (pass:[*]_callback_)(struct tep_event pass:[*], struct tep_record pass:[*], int, void pass:[*]), void pass:[*]_callback_context_);

--

DESCRIPTION
-----------
Trace systems and events related APIs.

The _tracefs_event_systems()_ function returns array of strings with the
names of all registered trace systems, located in the given _tracing_dir_
directory. This could be NULL or the location of the tracefs mount point
for the trace systems of the local machine, or it may be a path to a copy
of the tracefs directory from another machine. The last entry in the array
is a NULL pointer. The array must be freed with _tracefs_list_free()_ API.

The _tracefs_system_events()_ function returns array of strings with the
names of all registered trace events for given trace system specified by
_system_, located in the given _tracing_dir_ directory. This could be NULL
or the location of the tracefs mount point for the trace systems of the
local machine, or it may be a path to a copy of the tracefs directory
from another machine. The last entry in the array as a NULL pointer.
The array must be freed with _tracefs_list_free()_ API.

The _tracefs_event_enable()_ function enables a given event based on
the _system_ and _event_ passed in for the given _instance_. If _instance_
is NULL, then the top level tracing directory is used. If _system_
and _event_ are both NULL, then all events are enabled for the  _instance_.
If _event_ is NULL then all events within the _system_ are enabled.
If _system_ is NULL, then all systems are searched and any event within
a system that matches _event_ is enabled. Both _system_ and _event_ may
be regular expressions as defined by *regex*(3).

The _tracefs_event_disable()_ function disables the events that match
the _system_ and _event_ parameters for the given _instance_. What events
are disable follow the same rules as _tracefs_event_enable()_ for matching
events. That is, if _instance_ is NULL, then the top level tracing directory
is used. If both _system_ and _event_ are NULL then all events are disabled
for the given _instance_, and so on.

The _tracefs_iterate_raw_events()_ function will read the tracefs raw
data buffers and call the specified _callback_ function for every event it
encounters. Events are iterated in sorted order: oldest first. An initialized
_tep_ handler is required (See _tracefs_local_events_(3)). If _instance_ is
NULL, then the toplevel tracefs buffer is used, otherwise the buffer for
the corresponding _instance_ is read. To filter only on a subset of CPUs,
_cpus_ and _cpu_size_ may be set to only call _callback_ with events that
occurred on the CPUs specified, otherwise if _cpus_ is NULL then the _callback_
function will be called for all events, and _cpu_size_ is ignored. The
_callback_ function will be called with the following parameters: A
pointer to a struct tep_event that corresponds to the type of event the
record is; The record representing the event; The CPU that the event
occurred on; and a pointer to user specified _callback_context_. If the _callback_
returns non-zero, the iteration stops.


RETURN VALUE
------------
The _tracefs_event_systems()_ and __tracefs_system_events()_ functions return
an array of strings. The last element in that array is a NULL pointer. The array
must be freed with _tracefs_list_free()_ API. In case of an error, NULL is returned.

Both _tracefs_event_enable()_ and _tracefs_event_disable()_ return 0 if they found
any matching events (Note it does not check the previous status of the event. If
_tracefs_event_enable()_ finds an event that is already enabled, and there are no
other errors, then it will return 0). If an error occurs, even if other events were
found, it will return -1 and errno will be set. If no errors occur, but no events
are found that match the _system_ and _event_ parameters, then -1 is returned
and errno is not set.

The _tracefs_iterate_raw_events()_ function returns -1 in case of an error or
0 otherwise.

EXAMPLE
-------
[source,c]
--
#include <tracefs.h>

char **systems = tracefs_event_systems(NULL);

	if (systems) {
		int i = 0;
		/* Got registered trace systems from the top trace instance */
		while (systems[i]) {
			char **events = tracefs_system_events(NULL, systems[i]);
			if (events) {
				/* Got registered events in system[i] from the top trace instance */
				int j = 0;

				while (events[j]) {
					/* Got event[j] in system[i] from the top trace instance */
					j++;
				}
				tracefs_list_free(events);
			}
			i++;
		}
		tracefs_list_free(systems);
	}
....
static int records_walk(struct tep_event *tep, struct tep_record *record, int cpu, void *context)
{
	/* Got recorded event on cpu */
	return 0;
}
...
struct tep_event *tep = tracefs_local_events(NULL);

	if (!tep) {
		/* Failed to initialise tep handler with local events */
		...
	}

	errno = 0;
	ret = tracefs_event_enable(NULL, "sched", NULL);
	if (ret < 0 && !errno)
		printf("Could not find 'sched' events\n");
	tracefs_event_enable(NULL, "irq", "irq_handler_\(enter\|exit\)");

	if (tracefs_iterate_raw_events(tep, NULL, NULL, 0, records_walk, NULL) < 0) {
		/* Error walking through the recorded raw events */
	}

	/* Disable all events */
	tracefs_event_disable(NULL, NULL, NULL);
	tep_free(tep);
--
FILES
-----
[verse]
--
*tracefs.h*
	Header file to include in order to have access to the library APIs.
*-ltracefs*
	Linker switch to add when building a program that uses the library.
--

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

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

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

RESOURCES
---------
https://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git/

COPYING
-------
Copyright \(C) 2020 VMware, Inc. Free use of this software is granted under
the terms of the GNU Public License (GPL).
