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

NAME
----
tracefs_event_systems, tracefs_system_events, tracefs_event_enable, tracefs_event_disable,
tracefs_event_is_enabled - Work with trace systems and events.

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

enum tracefs_event_state {
	TRACEFS_ERROR = -1,
	TRACEFS_ALL_DISABLED = 0,
	TRACEFS_ALL_ENABLED = 1,
	TRACEFS_SOME_ENABLED = 2,
};

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_);
enum tracefs_enable_state *tracefs_event_is_enabled*(struct tracefs_instance pass:[*]_instance_,
			 const char pass:[*]_system_, const char pass:[*]_event_);
--

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_event_is_enabled()* returns if an event is enabled, a set of
events are enabled, a system is enabled, or all events are enabled. If both
_system_ and _event_ are NULL, then it returns the enable state of all events.
If _system_ is not NULL and _event_ is NULL, then it will check if all the events
in all the systems that _system_ and return the enable state of those events.
If _system_ is NULL and _event_ is not NULL, then it will match all the events
in all systems that match _event_ and return their enabled state. If both _system_
and _event_ are not NULL, then it will return the enabled state of all matching
events. The enabled state is defined as:

*TRACEFS_ERROR* - An error occurred including no event were matched.

*TRACEFS_ALL_DISABLED* - All matching events are disabled.

*TRACEFS_ALL_ENABLED* - All matching events are enabled.

*TRACEFS_SOME_ENABLED* - Some matching events were enabled while others were not.

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_event_is_enabled()* returns the enabled status of the matching events
or TRACEFS_ERROR on error.

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_handle *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).
