summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Elder <paul.elder@ideasonboard.com>2020-10-19 19:18:17 +0900
committerPaul Elder <paul.elder@ideasonboard.com>2020-11-03 11:07:21 +0900
commitfcc6d4bd76874585336cb0bbbd369702b59515d2 (patch)
tree7d35d18c516ef49e39cc8bf9e5c9aabfc7bb7dc2
parent4757ff4ab7b4dac560cad26db12e28ef741c96ff (diff)
libcamera: tracing: Implement tracing infrastructure
Implement tracing infrastructure in libcamera. It takes .tp files, as required by lttng, and generates a tracepoint header and C file, as lttng requires. meson is updated accordingly to get it to compile with the rest of libcamera. Update the documentation accordingly. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
-rw-r--r--Documentation/Doxyfile.in4
-rw-r--r--README.rst3
-rw-r--r--include/libcamera/internal/meson.build9
-rw-r--r--include/libcamera/internal/tracepoints.h.in61
-rw-r--r--include/libcamera/internal/tracepoints/meson.build4
-rw-r--r--meson.build3
-rw-r--r--meson_options.txt5
-rw-r--r--src/libcamera/meson.build7
-rw-r--r--src/libcamera/tracepoints.cpp10
-rw-r--r--utils/meson.build1
-rw-r--r--utils/tracepoints/gen-tp-header.py38
-rw-r--r--utils/tracepoints/meson.build5
12 files changed, 149 insertions, 1 deletions
diff --git a/Documentation/Doxyfile.in b/Documentation/Doxyfile.in
index fa8d744b..87959e23 100644
--- a/Documentation/Doxyfile.in
+++ b/Documentation/Doxyfile.in
@@ -840,7 +840,9 @@ EXCLUDE = @TOP_SRCDIR@/include/libcamera/span.h \
@TOP_SRCDIR@/src/libcamera/device_enumerator_sysfs.cpp \
@TOP_SRCDIR@/src/libcamera/device_enumerator_udev.cpp \
@TOP_SRCDIR@/src/libcamera/pipeline/ \
- @TOP_SRCDIR@/src/libcamera/proxy/
+ @TOP_SRCDIR@/src/libcamera/proxy/ \
+ @TOP_SRCDIR@/src/libcamera/tracepoints.cpp \
+ @TOP_BUILDDIR@/include/libcamera/internal/tracepoints.h
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
# directories that are symbolic links (a Unix file system feature) are excluded
diff --git a/README.rst b/README.rst
index 74babaf7..f8519b44 100644
--- a/README.rst
+++ b/README.rst
@@ -81,6 +81,9 @@ for gstreamer: [optional]
for qcam: [optional]
qtbase5-dev libqt5core5a libqt5gui5 libqt5widgets5 qttools5-dev-tools libtiff-dev
+for tracing with lttng: [optional]
+ lttng-ust-dev python3-jinja2
+
Using GStreamer plugin
~~~~~~~~~~~~~~~~~~~~~~
diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build
index 15010338..6500fe2a 100644
--- a/include/libcamera/internal/meson.build
+++ b/include/libcamera/internal/meson.build
@@ -1,5 +1,14 @@
# SPDX-License-Identifier: CC0-1.0
+subdir('tracepoints')
+
+libcamera_tracepoint_header = custom_target(
+ 'tp_header',
+ input: [ 'tracepoints.h.in', tracepoint_files ],
+ output: 'tracepoints.h',
+ command: [ gen_tracepoints_header, '@OUTPUT@', '@INPUT@' ],
+)
+
libcamera_internal_headers = files([
'byte_stream_buffer.h',
'camera_controls.h',
diff --git a/include/libcamera/internal/tracepoints.h.in b/include/libcamera/internal/tracepoints.h.in
new file mode 100644
index 00000000..d0fc1365
--- /dev/null
+++ b/include/libcamera/internal/tracepoints.h.in
@@ -0,0 +1,61 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) {{year}}, Google Inc.
+ *
+ * tracepoints.h - Tracepoints with lttng
+ *
+ * This file is auto-generated. Do not edit.
+ */
+#ifndef __LIBCAMERA_INTERNAL_TRACEPOINTS_H__
+#define __LIBCAMERA_INTERNAL_TRACEPOINTS_H__
+
+#if HAVE_TRACING
+#define LIBCAMERA_TRACEPOINT(...) tracepoint(libcamera, __VA_ARGS__)
+
+#define LIBCAMERA_TRACEPOINT_IPA_BEGIN(pipe, func) \
+tracepoint(libcamera, ipa_call_begin, #pipe, #func)
+
+#define LIBCAMERA_TRACEPOINT_IPA_END(pipe, func) \
+tracepoint(libcamera, ipa_call_end, #pipe, #func)
+
+#else
+
+namespace {
+
+template <typename ...Args>
+inline void unused([[maybe_unused]] Args&& ...args)
+{
+}
+
+} /* namespace */
+
+#define LIBCAMERA_TRACEPOINT(category, ...) unused(__VA_ARGS__)
+
+#define LIBCAMERA_TRACEPOINT_IPA_BEGIN(pipe, func)
+#define LIBCAMERA_TRACEPOINT_IPA_END(pipe, func)
+
+#endif /* HAVE_TRACING */
+
+#endif /* __LIBCAMERA_INTERNAL_TRACEPOINTS_H__ */
+
+
+#if HAVE_TRACING
+
+#undef TRACEPOINT_PROVIDER
+#define TRACEPOINT_PROVIDER libcamera
+
+#undef TRACEPOINT_INCLUDE
+#define TRACEPOINT_INCLUDE "{{path}}"
+
+#if !defined(INCLUDE_LIBCAMERA_INTERNAL_TRACEPOINTS_TP_H) || defined(TRACEPOINT_HEADER_MULTI_READ)
+#define INCLUDE_LIBCAMERA_INTERNAL_TRACEPOINTS_TP_H
+
+#include <lttng/tracepoint.h>
+
+{{source}}
+
+#endif /* INCLUDE_LIBCAMERA_INTERNAL_TRACEPOINTS_TP_H */
+
+#include <lttng/tracepoint-event.h>
+
+#endif /* HAVE_TRACING */
diff --git a/include/libcamera/internal/tracepoints/meson.build b/include/libcamera/internal/tracepoints/meson.build
new file mode 100644
index 00000000..2dd6733e
--- /dev/null
+++ b/include/libcamera/internal/tracepoints/meson.build
@@ -0,0 +1,4 @@
+# SPDX-License-Identifier: CC0-1.0
+
+tracepoint_files = files([
+])
diff --git a/meson.build b/meson.build
index e6f6c84a..55cf36e1 100644
--- a/meson.build
+++ b/meson.build
@@ -108,6 +108,9 @@ libcamera_includes = include_directories('include')
# Sub-directories fill py_modules with their dependencies.
py_modules = []
+# Libraries used by multiple components
+liblttng = cc.find_library('lttng-ust', required : get_option('tracing'))
+
# Utilities are parsed first to provide support for other components.
subdir('utils')
diff --git a/meson_options.txt b/meson_options.txt
index 7f7b3e59..53f2675e 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -28,6 +28,11 @@ option('test',
type : 'boolean',
description: 'Compile and include the tests')
+option('tracing',
+ type : 'feature',
+ value : 'auto',
+ description: 'Enable tracing (based on lttng)')
+
option('v4l2',
type : 'boolean',
value : false,
diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
index 07711b5f..99b27e66 100644
--- a/src/libcamera/meson.build
+++ b/src/libcamera/meson.build
@@ -55,6 +55,7 @@ libcamera_sources = files([
])
libcamera_sources += libcamera_public_headers
+libcamera_sources += libcamera_tracepoint_header
includes = [
libcamera_includes,
@@ -72,6 +73,11 @@ if libgnutls.found()
config_h.set('HAVE_GNUTLS', 1)
endif
+if liblttng.found()
+ config_h.set('HAVE_TRACING', 1)
+ libcamera_sources += files(['tracepoints.cpp'])
+endif
+
if libudev.found()
config_h.set('HAVE_LIBUDEV', 1)
libcamera_sources += files([
@@ -114,6 +120,7 @@ libcamera_deps = [
libatomic,
libdl,
libgnutls,
+ liblttng,
libudev,
dependency('threads'),
]
diff --git a/src/libcamera/tracepoints.cpp b/src/libcamera/tracepoints.cpp
new file mode 100644
index 00000000..0173b75a
--- /dev/null
+++ b/src/libcamera/tracepoints.cpp
@@ -0,0 +1,10 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2020, Google Inc.
+ *
+ * tracepoints.cpp - Tracepoints with lttng
+ */
+#define TRACEPOINT_CREATE_PROBES
+#define TRACEPOINT_DEFINE
+
+#include "libcamera/internal/tracepoints.h"
diff --git a/utils/meson.build b/utils/meson.build
index 3d83b975..7f2b9b4d 100644
--- a/utils/meson.build
+++ b/utils/meson.build
@@ -1,6 +1,7 @@
# SPDX-License-Identifier: CC0-1.0
subdir('ipu3')
+subdir('tracepoints')
## Code generation
py_modules += ['yaml']
diff --git a/utils/tracepoints/gen-tp-header.py b/utils/tracepoints/gen-tp-header.py
new file mode 100644
index 00000000..bbd472d9
--- /dev/null
+++ b/utils/tracepoints/gen-tp-header.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (C) 2020, Google Inc.
+#
+# Author: Paul Elder <paul.elder@ideasonboard.com>
+#
+# gen-tp-header.py - Generate header file to contain lttng tracepoints
+
+import datetime
+import jinja2
+import os
+import sys
+
+def main(argv):
+ if len(argv) < 3:
+ print(f'Usage: {argv[0]} output template tp_files...')
+ return 1
+
+ output = argv[1]
+ template = argv[2]
+
+ year = datetime.datetime.now().year
+ path = output.replace('include/', '', 1)
+
+ source = ''
+ for fname in argv[3:]:
+ source += open(fname, 'r', encoding='utf-8').read() + '\n\n'
+
+ template = jinja2.Template(open(template, 'r', encoding='utf-8').read())
+ string = template.render(year=year, path=path, source=source)
+
+ f = open(output, 'w', encoding='utf-8').write(string)
+
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv))
diff --git a/utils/tracepoints/meson.build b/utils/tracepoints/meson.build
new file mode 100644
index 00000000..807230fc
--- /dev/null
+++ b/utils/tracepoints/meson.build
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: CC0-1.0
+
+py_modules += ['jinja2']
+
+gen_tracepoints_header = find_program('./gen-tp-header.py')