root/tools/perf/util/trace-event.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. trace_event__init
  2. trace_event__init2
  3. trace_event__register_resolver
  4. trace_event__cleanup
  5. tp_format
  6. trace_event__tp_format
  7. trace_event__tp_format_id

   1 // SPDX-License-Identifier: GPL-2.0
   2 
   3 #include <stdio.h>
   4 #include <unistd.h>
   5 #include <stdlib.h>
   6 #include <errno.h>
   7 #include <sys/types.h>
   8 #include <sys/stat.h>
   9 #include <fcntl.h>
  10 #include <linux/kernel.h>
  11 #include <linux/err.h>
  12 #include <traceevent/event-parse.h>
  13 #include <api/fs/tracing_path.h>
  14 #include <api/fs/fs.h>
  15 #include "trace-event.h"
  16 #include "machine.h"
  17 
  18 /*
  19  * global trace_event object used by trace_event__tp_format
  20  *
  21  * TODO There's no cleanup call for this. Add some sort of
  22  * __exit function support and call trace_event__cleanup
  23  * there.
  24  */
  25 static struct trace_event tevent;
  26 static bool tevent_initialized;
  27 
  28 int trace_event__init(struct trace_event *t)
  29 {
  30         struct tep_handle *pevent = tep_alloc();
  31 
  32         if (pevent) {
  33                 t->plugin_list = tep_load_plugins(pevent);
  34                 t->pevent  = pevent;
  35         }
  36 
  37         return pevent ? 0 : -1;
  38 }
  39 
  40 static int trace_event__init2(void)
  41 {
  42         int be = tep_is_bigendian();
  43         struct tep_handle *pevent;
  44 
  45         if (trace_event__init(&tevent))
  46                 return -1;
  47 
  48         pevent = tevent.pevent;
  49         tep_set_flag(pevent, TEP_NSEC_OUTPUT);
  50         tep_set_file_bigendian(pevent, be);
  51         tep_set_local_bigendian(pevent, be);
  52         tevent_initialized = true;
  53         return 0;
  54 }
  55 
  56 int trace_event__register_resolver(struct machine *machine,
  57                                    tep_func_resolver_t *func)
  58 {
  59         if (!tevent_initialized && trace_event__init2())
  60                 return -1;
  61 
  62         return tep_set_function_resolver(tevent.pevent, func, machine);
  63 }
  64 
  65 void trace_event__cleanup(struct trace_event *t)
  66 {
  67         tep_unload_plugins(t->plugin_list, t->pevent);
  68         tep_free(t->pevent);
  69 }
  70 
  71 /*
  72  * Returns pointer with encoded error via <linux/err.h> interface.
  73  */
  74 static struct tep_event*
  75 tp_format(const char *sys, const char *name)
  76 {
  77         char *tp_dir = get_events_file(sys);
  78         struct tep_handle *pevent = tevent.pevent;
  79         struct tep_event *event = NULL;
  80         char path[PATH_MAX];
  81         size_t size;
  82         char *data;
  83         int err;
  84 
  85         if (!tp_dir)
  86                 return ERR_PTR(-errno);
  87 
  88         scnprintf(path, PATH_MAX, "%s/%s/format", tp_dir, name);
  89         put_events_file(tp_dir);
  90 
  91         err = filename__read_str(path, &data, &size);
  92         if (err)
  93                 return ERR_PTR(err);
  94 
  95         tep_parse_format(pevent, &event, data, size, sys);
  96 
  97         free(data);
  98         return event;
  99 }
 100 
 101 /*
 102  * Returns pointer with encoded error via <linux/err.h> interface.
 103  */
 104 struct tep_event*
 105 trace_event__tp_format(const char *sys, const char *name)
 106 {
 107         if (!tevent_initialized && trace_event__init2())
 108                 return ERR_PTR(-ENOMEM);
 109 
 110         return tp_format(sys, name);
 111 }
 112 
 113 struct tep_event *trace_event__tp_format_id(int id)
 114 {
 115         if (!tevent_initialized && trace_event__init2())
 116                 return ERR_PTR(-ENOMEM);
 117 
 118         return tep_find_event(tevent.pevent, id);
 119 }

/* [<][>][^][v][top][bottom][index][help] */