trace-event.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <errno.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <fcntl.h>
  8. #include <linux/kernel.h>
  9. #include <traceevent/event-parse.h>
  10. #include "trace-event.h"
  11. #include "util.h"
  12. /*
  13. * global trace_event object used by trace_event__tp_format
  14. *
  15. * TODO There's no cleanup call for this. Add some sort of
  16. * __exit function support and call trace_event__cleanup
  17. * there.
  18. */
  19. static struct trace_event tevent;
  20. int trace_event__init(struct trace_event *t)
  21. {
  22. struct pevent *pevent = pevent_alloc();
  23. if (pevent) {
  24. t->plugin_list = traceevent_load_plugins(pevent);
  25. t->pevent = pevent;
  26. }
  27. return pevent ? 0 : -1;
  28. }
  29. void trace_event__cleanup(struct trace_event *t)
  30. {
  31. traceevent_unload_plugins(t->plugin_list, t->pevent);
  32. pevent_free(t->pevent);
  33. }
  34. static struct event_format*
  35. tp_format(const char *sys, const char *name)
  36. {
  37. struct pevent *pevent = tevent.pevent;
  38. struct event_format *event = NULL;
  39. char path[PATH_MAX];
  40. size_t size;
  41. char *data;
  42. scnprintf(path, PATH_MAX, "%s/%s/%s/format",
  43. tracing_events_path, sys, name);
  44. if (filename__read_str(path, &data, &size))
  45. return NULL;
  46. pevent_parse_format(pevent, &event, data, size, sys);
  47. free(data);
  48. return event;
  49. }
  50. struct event_format*
  51. trace_event__tp_format(const char *sys, const char *name)
  52. {
  53. static bool initialized;
  54. if (!initialized) {
  55. int be = traceevent_host_bigendian();
  56. struct pevent *pevent;
  57. if (trace_event__init(&tevent))
  58. return NULL;
  59. pevent = tevent.pevent;
  60. pevent_set_flag(pevent, PEVENT_NSEC_OUTPUT);
  61. pevent_set_file_bigendian(pevent, be);
  62. pevent_set_host_bigendian(pevent, be);
  63. initialized = true;
  64. }
  65. return tp_format(sys, name);
  66. }