10069ea6e0e30b442775dd3a76fe14e2bc5d1ae4
[libside.git] / include / side / abi / visitor.h
1 // SPDX-License-Identifier: MIT
2 /*
3 * Copyright 2022-2023 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 */
5
6 #ifndef SIDE_ABI_VISITOR_H
7 #define SIDE_ABI_VISITOR_H
8
9 #include <stdint.h>
10 #include <side/macros.h>
11 #include <side/endian.h>
12
13 /*
14 * SIDE ABI for visitor pattern.
15 *
16 * The visitor pattern is a double-dispatch visitor. Changing this ABI
17 * is a breaking ABI change.
18 *
19 * This ABI is a contract between the instrumented application and
20 * user-space tracers. Kernel tracers are not expected to interact with
21 * visitors directly: a proxy in libside should execute visitors to
22 * convert their output to other types which can be read by the kernel
23 * tracers.
24 */
25
26 struct side_arg;
27 struct side_arg_dynamic_field;
28 struct side_tracer_visitor_ctx;
29 struct side_tracer_dynamic_struct_visitor_ctx;
30
31
32 typedef enum side_visitor_status (*side_write_elem_func)(
33 const struct side_tracer_visitor_ctx *tracer_ctx,
34 const struct side_arg *elem);
35 typedef enum side_visitor_status (*side_visitor_func)(
36 const struct side_tracer_visitor_ctx *tracer_ctx,
37 void *app_ctx);
38
39 struct side_tracer_visitor_ctx {
40 side_write_elem_func write_elem;
41 void *priv; /* Private tracer context. */
42 } SIDE_PACKED;
43
44 typedef enum side_visitor_status (*side_write_field_func)(
45 const struct side_tracer_dynamic_struct_visitor_ctx *tracer_ctx,
46 const struct side_arg_dynamic_field *dynamic_field);
47 typedef enum side_visitor_status (*side_dynamic_struct_visitor_func)(
48 const struct side_tracer_dynamic_struct_visitor_ctx *tracer_ctx,
49 void *app_ctx);
50
51 struct side_tracer_dynamic_struct_visitor_ctx {
52 side_write_field_func write_field;
53 void *priv; /* Private tracer context. */
54 } SIDE_PACKED;
55
56 #endif /* SIDE_ABI_VISITOR_H */
This page took 0.030298 seconds and 3 git commands to generate.