1 // SPDX-License-Identifier: MIT
3 * Copyright 2022 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
12 #include <side/trace.h>
15 /* User code example */
17 static side_define_event(my_provider_event
, "myprovider", "myevent", SIDE_LOGLEVEL_DEBUG
,
20 side_field("abc", SIDE_TYPE_U32
, side_attr_list()),
21 side_field("def", SIDE_TYPE_S64
, side_attr_list()),
22 side_field("dynamic", SIDE_TYPE_DYNAMIC
, side_attr_list()),
27 void test_fields(void)
32 my_provider_event
.enabled
= 1;
33 side_event(&my_provider_event
, side_arg_list(side_arg_u32(uw
), side_arg_s64(sdw
),
34 side_arg_dynamic(side_arg_dynamic_string("zzz"))));
37 static side_define_event(my_provider_event2
, "myprovider", "myevent2", SIDE_LOGLEVEL_DEBUG
,
40 side_field_struct("structfield",
42 side_field("x", SIDE_TYPE_U32
, side_attr_list()),
43 side_field("y", SIDE_TYPE_S64
, side_attr_list()),
47 side_field("z", SIDE_TYPE_U8
, side_attr_list()),
52 void test_struct(void)
54 my_provider_event2
.enabled
= 1;
55 side_event_cond(&my_provider_event2
) {
56 side_arg_define_vec(mystruct
, side_arg_list(side_arg_u32(21), side_arg_s64(22)));
57 side_event_call(&my_provider_event2
, side_arg_list(side_arg_struct(&mystruct
), side_arg_u8(55)));
61 static side_define_event(my_provider_event_array
, "myprovider", "myarray", SIDE_LOGLEVEL_DEBUG
,
64 side_field_array("arr", side_elem_type(SIDE_TYPE_U32
, side_attr_list()), 3, side_attr_list()),
65 side_field("v", SIDE_TYPE_S64
, side_attr_list()),
72 my_provider_event_array
.enabled
= 1;
73 side_event_cond(&my_provider_event_array
) {
74 side_arg_define_vec(myarray
, side_arg_list(side_arg_u32(1), side_arg_u32(2), side_arg_u32(3)));
75 side_event_call(&my_provider_event_array
, side_arg_list(side_arg_array(&myarray
), side_arg_s64(42)));
79 static side_define_event(my_provider_event_vla
, "myprovider", "myvla", SIDE_LOGLEVEL_DEBUG
,
82 side_field_vla("vla", side_elem_type(SIDE_TYPE_U32
, side_attr_list()), side_attr_list()),
83 side_field("v", SIDE_TYPE_S64
, side_attr_list()),
90 my_provider_event_vla
.enabled
= 1;
91 side_event_cond(&my_provider_event_vla
) {
92 side_arg_define_vec(myvla
, side_arg_list(side_arg_u32(1), side_arg_u32(2), side_arg_u32(3)));
93 side_event_call(&my_provider_event_vla
, side_arg_list(side_arg_vla(&myvla
), side_arg_s64(42)));
97 /* 1D array visitor */
99 struct app_visitor_ctx
{
105 enum side_visitor_status
test_visitor(const struct side_tracer_visitor_ctx
*tracer_ctx
, void *_ctx
)
107 struct app_visitor_ctx
*ctx
= (struct app_visitor_ctx
*) _ctx
;
108 uint32_t length
= ctx
->length
, i
;
110 for (i
= 0; i
< length
; i
++) {
111 const struct side_arg_vec elem
= {
112 .type
= SIDE_TYPE_U32
,
114 .side_u32
= ctx
->ptr
[i
],
117 if (tracer_ctx
->write_elem(tracer_ctx
, &elem
) != SIDE_VISITOR_STATUS_OK
)
118 return SIDE_VISITOR_STATUS_ERROR
;
120 return SIDE_VISITOR_STATUS_OK
;
123 static uint32_t testarray
[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
125 static side_define_event(my_provider_event_vla_visitor
, "myprovider", "myvlavisit", SIDE_LOGLEVEL_DEBUG
,
128 side_field_vla_visitor("vlavisit", side_elem_type(SIDE_TYPE_U32
, side_attr_list()), test_visitor
, side_attr_list()),
129 side_field("v", SIDE_TYPE_S64
, side_attr_list()),
134 void test_vla_visitor(void)
136 my_provider_event_vla_visitor
.enabled
= 1;
137 side_event_cond(&my_provider_event_vla_visitor
) {
138 struct app_visitor_ctx ctx
= {
140 .length
= SIDE_ARRAY_SIZE(testarray
),
142 side_event_call(&my_provider_event_vla_visitor
, side_arg_list(side_arg_vla_visitor(&ctx
), side_arg_s64(42)));
146 /* 2D array visitor */
148 struct app_visitor_2d_inner_ctx
{
154 enum side_visitor_status
test_inner_visitor(const struct side_tracer_visitor_ctx
*tracer_ctx
, void *_ctx
)
156 struct app_visitor_2d_inner_ctx
*ctx
= (struct app_visitor_2d_inner_ctx
*) _ctx
;
157 uint32_t length
= ctx
->length
, i
;
159 for (i
= 0; i
< length
; i
++) {
160 const struct side_arg_vec elem
= {
161 .type
= SIDE_TYPE_U32
,
163 .side_u32
= ctx
->ptr
[i
],
166 if (tracer_ctx
->write_elem(tracer_ctx
, &elem
) != SIDE_VISITOR_STATUS_OK
)
167 return SIDE_VISITOR_STATUS_ERROR
;
169 return SIDE_VISITOR_STATUS_OK
;
172 struct app_visitor_2d_outer_ctx
{
173 const uint32_t (*ptr
)[2];
178 enum side_visitor_status
test_outer_visitor(const struct side_tracer_visitor_ctx
*tracer_ctx
, void *_ctx
)
180 struct app_visitor_2d_outer_ctx
*ctx
= (struct app_visitor_2d_outer_ctx
*) _ctx
;
181 uint32_t length
= ctx
->length
, i
;
183 for (i
= 0; i
< length
; i
++) {
184 struct app_visitor_2d_inner_ctx inner_ctx
= {
188 const struct side_arg_vec elem
= side_arg_vla_visitor(&inner_ctx
);
189 if (tracer_ctx
->write_elem(tracer_ctx
, &elem
) != SIDE_VISITOR_STATUS_OK
)
190 return SIDE_VISITOR_STATUS_ERROR
;
192 return SIDE_VISITOR_STATUS_OK
;
195 static uint32_t testarray2d
[][2] = {
201 static side_define_event(my_provider_event_vla_visitor2d
, "myprovider", "myvlavisit2d", SIDE_LOGLEVEL_DEBUG
,
204 side_field_vla_visitor("vlavisit2d",
206 side_type_vla_visitor_decl(
207 side_elem_type(SIDE_TYPE_U32
, side_attr_list()),
210 ), test_outer_visitor
, side_attr_list()),
211 side_field("v", SIDE_TYPE_S64
, side_attr_list()),
216 void test_vla_visitor_2d(void)
218 my_provider_event_vla_visitor2d
.enabled
= 1;
219 side_event_cond(&my_provider_event_vla_visitor2d
) {
220 struct app_visitor_2d_outer_ctx ctx
= {
222 .length
= SIDE_ARRAY_SIZE(testarray2d
),
224 side_event_call(&my_provider_event_vla_visitor2d
, side_arg_list(side_arg_vla_visitor(&ctx
), side_arg_s64(42)));
228 static int64_t array_fixint
[] = { -444, 555, 123, 2897432587 };
230 static side_define_event(my_provider_event_array_fixint
, "myprovider", "myarrayfixint", SIDE_LOGLEVEL_DEBUG
,
233 side_field_array("arrfixint", side_elem_type(SIDE_TYPE_S64
, side_attr_list()), SIDE_ARRAY_SIZE(array_fixint
), side_attr_list()),
234 side_field("v", SIDE_TYPE_S64
, side_attr_list()),
239 void test_array_fixint(void)
241 my_provider_event_array_fixint
.enabled
= 1;
242 side_event(&my_provider_event_array_fixint
,
243 side_arg_list(side_arg_array_s64(array_fixint
), side_arg_s64(42)));
246 static int64_t vla_fixint
[] = { -444, 555, 123, 2897432587 };
248 static side_define_event(my_provider_event_vla_fixint
, "myprovider", "myvlafixint", SIDE_LOGLEVEL_DEBUG
,
251 side_field_vla("vlafixint", side_elem_type(SIDE_TYPE_S64
, side_attr_list()), side_attr_list()),
252 side_field("v", SIDE_TYPE_S64
, side_attr_list()),
257 void test_vla_fixint(void)
259 my_provider_event_vla_fixint
.enabled
= 1;
260 side_event(&my_provider_event_vla_fixint
,
261 side_arg_list(side_arg_vla_s64(vla_fixint
, SIDE_ARRAY_SIZE(vla_fixint
)), side_arg_s64(42)));
264 static side_define_event(my_provider_event_dynamic_basic
,
265 "myprovider", "mydynamicbasic", SIDE_LOGLEVEL_DEBUG
,
268 side_field("dynamic", SIDE_TYPE_DYNAMIC
, side_attr_list()),
273 void test_dynamic_basic_type(void)
275 my_provider_event_dynamic_basic
.enabled
= 1;
276 side_event(&my_provider_event_dynamic_basic
,
277 side_arg_list(side_arg_dynamic(side_arg_dynamic_s16(-33))));
280 static side_define_event(my_provider_event_dynamic_vla
,
281 "myprovider", "mydynamicvla", SIDE_LOGLEVEL_DEBUG
,
284 side_field("dynamic", SIDE_TYPE_DYNAMIC
, side_attr_list()),
289 void test_dynamic_vla(void)
291 side_arg_dynamic_define_vec(myvla
,
293 side_arg_dynamic_u32(1), side_arg_dynamic_u32(2), side_arg_dynamic_u32(3),
296 my_provider_event_dynamic_vla
.enabled
= 1;
297 side_event(&my_provider_event_dynamic_vla
,
298 side_arg_list(side_arg_dynamic(side_arg_dynamic_vla(&myvla
))));
301 static side_define_event(my_provider_event_dynamic_null
,
302 "myprovider", "mydynamicnull", SIDE_LOGLEVEL_DEBUG
,
305 side_field("dynamic", SIDE_TYPE_DYNAMIC
, side_attr_list()),
310 void test_dynamic_null(void)
312 my_provider_event_dynamic_null
.enabled
= 1;
313 side_event(&my_provider_event_dynamic_null
,
314 side_arg_list(side_arg_dynamic(side_arg_dynamic_null())));
317 static side_define_event(my_provider_event_dynamic_struct
,
318 "myprovider", "mydynamicstruct", SIDE_LOGLEVEL_DEBUG
,
321 side_field("dynamic", SIDE_TYPE_DYNAMIC
, side_attr_list()),
326 void test_dynamic_struct(void)
328 side_arg_dynamic_define_struct(mystruct
,
330 side_arg_dynamic_field("a", side_arg_dynamic_u32(43)),
331 side_arg_dynamic_field("b", side_arg_dynamic_string("zzz")),
332 side_arg_dynamic_field("c", side_arg_dynamic_null()),
336 my_provider_event_dynamic_struct
.enabled
= 1;
337 side_event(&my_provider_event_dynamic_struct
,
338 side_arg_list(side_arg_dynamic(side_arg_dynamic_struct(&mystruct
))));
341 static side_define_event(my_provider_event_dynamic_nested_struct
,
342 "myprovider", "mydynamicnestedstruct", SIDE_LOGLEVEL_DEBUG
,
345 side_field("dynamic", SIDE_TYPE_DYNAMIC
, side_attr_list()),
350 void test_dynamic_nested_struct(void)
352 side_arg_dynamic_define_struct(nested
,
354 side_arg_dynamic_field("a", side_arg_dynamic_u32(43)),
355 side_arg_dynamic_field("b", side_arg_dynamic_u8(55)),
358 side_arg_dynamic_define_struct(nested2
,
360 side_arg_dynamic_field("aa", side_arg_dynamic_u64(128)),
361 side_arg_dynamic_field("bb", side_arg_dynamic_u16(1)),
364 side_arg_dynamic_define_struct(mystruct
,
366 side_arg_dynamic_field("nested", side_arg_dynamic_struct(&nested
)),
367 side_arg_dynamic_field("nested2", side_arg_dynamic_struct(&nested2
)),
370 my_provider_event_dynamic_nested_struct
.enabled
= 1;
371 side_event(&my_provider_event_dynamic_nested_struct
,
372 side_arg_list(side_arg_dynamic(side_arg_dynamic_struct(&mystruct
))));
375 static side_define_event(my_provider_event_dynamic_vla_struct
,
376 "myprovider", "mydynamicvlastruct", SIDE_LOGLEVEL_DEBUG
,
379 side_field("dynamic", SIDE_TYPE_DYNAMIC
, side_attr_list()),
384 void test_dynamic_vla_struct(void)
386 side_arg_dynamic_define_struct(nested
,
388 side_arg_dynamic_field("a", side_arg_dynamic_u32(43)),
389 side_arg_dynamic_field("b", side_arg_dynamic_u8(55)),
392 side_arg_dynamic_define_vec(myvla
,
394 side_arg_dynamic_struct(&nested
),
395 side_arg_dynamic_struct(&nested
),
396 side_arg_dynamic_struct(&nested
),
397 side_arg_dynamic_struct(&nested
),
400 my_provider_event_dynamic_vla_struct
.enabled
= 1;
401 side_event(&my_provider_event_dynamic_vla_struct
,
402 side_arg_list(side_arg_dynamic(side_arg_dynamic_vla(&myvla
))));
405 static side_define_event(my_provider_event_dynamic_struct_vla
,
406 "myprovider", "mydynamicstructvla", SIDE_LOGLEVEL_DEBUG
,
409 side_field("dynamic", SIDE_TYPE_DYNAMIC
, side_attr_list()),
414 void test_dynamic_struct_vla(void)
416 side_arg_dynamic_define_vec(myvla
,
418 side_arg_dynamic_u32(1), side_arg_dynamic_u32(2), side_arg_dynamic_u32(3),
421 side_arg_dynamic_define_vec(myvla2
,
423 side_arg_dynamic_u32(4), side_arg_dynamic_u64(5), side_arg_dynamic_u32(6),
426 side_arg_dynamic_define_struct(mystruct
,
428 side_arg_dynamic_field("a", side_arg_dynamic_vla(&myvla
)),
429 side_arg_dynamic_field("b", side_arg_dynamic_vla(&myvla2
)),
432 my_provider_event_dynamic_struct_vla
.enabled
= 1;
433 side_event(&my_provider_event_dynamic_struct_vla
,
434 side_arg_list(side_arg_dynamic(side_arg_dynamic_struct(&mystruct
))));
437 static side_define_event(my_provider_event_dynamic_nested_vla
,
438 "myprovider", "mydynamicnestedvla", SIDE_LOGLEVEL_DEBUG
,
441 side_field("dynamic", SIDE_TYPE_DYNAMIC
, side_attr_list()),
446 void test_dynamic_nested_vla(void)
448 side_arg_dynamic_define_vec(nestedvla
,
450 side_arg_dynamic_u32(1), side_arg_dynamic_u16(2), side_arg_dynamic_u32(3),
453 side_arg_dynamic_define_vec(nestedvla2
,
455 side_arg_dynamic_u8(4), side_arg_dynamic_u32(5), side_arg_dynamic_u32(6),
458 side_arg_dynamic_define_vec(myvla
,
460 side_arg_dynamic_vla(&nestedvla
),
461 side_arg_dynamic_vla(&nestedvla2
),
464 my_provider_event_dynamic_nested_vla
.enabled
= 1;
465 side_event(&my_provider_event_dynamic_nested_vla
,
466 side_arg_list(side_arg_dynamic(side_arg_dynamic_vla(&myvla
))));
469 static side_define_event_variadic(my_provider_event_variadic
,
470 "myprovider", "myvariadicevent", SIDE_LOGLEVEL_DEBUG
,
476 void test_variadic(void)
478 my_provider_event_variadic
.enabled
= 1;
479 side_event_variadic(&my_provider_event_variadic
,
482 side_arg_dynamic_field("a", side_arg_dynamic_u32(55)),
483 side_arg_dynamic_field("b", side_arg_dynamic_s8(-4)),
488 static side_define_event_variadic(my_provider_event_static_variadic
,
489 "myprovider", "mystaticvariadicevent", SIDE_LOGLEVEL_DEBUG
,
492 side_field("abc", SIDE_TYPE_U32
, side_attr_list()),
493 side_field("def", SIDE_TYPE_U16
, side_attr_list()),
498 void test_static_variadic(void)
500 my_provider_event_static_variadic
.enabled
= 1;
501 side_event_variadic(&my_provider_event_static_variadic
,
507 side_arg_dynamic_field("a", side_arg_dynamic_u32(55)),
508 side_arg_dynamic_field("b", side_arg_dynamic_s8(-4)),
513 static side_define_event(my_provider_event_bool
, "myprovider", "myeventbool", SIDE_LOGLEVEL_DEBUG
,
516 side_field("a_false", SIDE_TYPE_BOOL
, side_attr_list()),
517 side_field("b_true", SIDE_TYPE_BOOL
, side_attr_list()),
518 side_field("c_true", SIDE_TYPE_BOOL
, side_attr_list()),
519 side_field("d_true", SIDE_TYPE_BOOL
, side_attr_list()),
520 side_field("e_true", SIDE_TYPE_BOOL
, side_attr_list()),
521 side_field("f_false", SIDE_TYPE_BOOL
, side_attr_list()),
522 side_field("g_true", SIDE_TYPE_BOOL
, side_attr_list()),
531 uint64_t c
= 0x12345678;
537 my_provider_event_bool
.enabled
= 1;
538 side_event(&my_provider_event_bool
,
551 static side_define_event_variadic(my_provider_event_dynamic_bool
,
552 "myprovider", "mydynamicbool", SIDE_LOGLEVEL_DEBUG
,
558 void test_dynamic_bool(void)
560 my_provider_event_dynamic_bool
.enabled
= 1;
561 side_event_variadic(&my_provider_event_dynamic_bool
,
564 side_arg_dynamic_field("a_true", side_arg_dynamic_bool(55)),
565 side_arg_dynamic_field("b_true", side_arg_dynamic_bool(-4)),
566 side_arg_dynamic_field("c_false", side_arg_dynamic_bool(0)),
567 side_arg_dynamic_field("d_true", side_arg_dynamic_bool(256)),
572 static side_define_event(my_provider_event_dynamic_vla_visitor
,
573 "myprovider", "mydynamicvlavisitor", SIDE_LOGLEVEL_DEBUG
,
576 side_field("dynamic", SIDE_TYPE_DYNAMIC
, side_attr_list()),
580 struct app_dynamic_vla_visitor_ctx
{
586 enum side_visitor_status
test_dynamic_vla_visitor(const struct side_tracer_dynamic_vla_visitor_ctx
*tracer_ctx
, void *_ctx
)
588 struct app_dynamic_vla_visitor_ctx
*ctx
= (struct app_dynamic_vla_visitor_ctx
*) _ctx
;
589 uint32_t length
= ctx
->length
, i
;
591 for (i
= 0; i
< length
; i
++) {
592 const struct side_arg_dynamic_vec elem
= {
593 .dynamic_type
= SIDE_DYNAMIC_TYPE_U32
,
595 .side_u32
= ctx
->ptr
[i
],
598 if (tracer_ctx
->write_elem(tracer_ctx
, &elem
) != SIDE_VISITOR_STATUS_OK
)
599 return SIDE_VISITOR_STATUS_ERROR
;
601 return SIDE_VISITOR_STATUS_OK
;
604 static uint32_t testarray_dynamic_vla
[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
607 void test_dynamic_vla_with_visitor(void)
609 my_provider_event_dynamic_vla_visitor
.enabled
= 1;
610 side_event_cond(&my_provider_event_dynamic_vla_visitor
) {
611 struct app_dynamic_vla_visitor_ctx ctx
= {
612 .ptr
= testarray_dynamic_vla
,
613 .length
= SIDE_ARRAY_SIZE(testarray_dynamic_vla
),
615 side_event_call(&my_provider_event_dynamic_vla_visitor
,
618 side_arg_dynamic_vla_visitor(test_dynamic_vla_visitor
, &ctx
)
625 static side_define_event(my_provider_event_dynamic_struct_visitor
,
626 "myprovider", "mydynamicstructvisitor", SIDE_LOGLEVEL_DEBUG
,
629 side_field("dynamic", SIDE_TYPE_DYNAMIC
, side_attr_list()),
633 struct struct_visitor_pair
{
638 struct app_dynamic_struct_visitor_ctx
{
639 const struct struct_visitor_pair
*ptr
;
644 enum side_visitor_status
test_dynamic_struct_visitor(const struct side_tracer_dynamic_struct_visitor_ctx
*tracer_ctx
, void *_ctx
)
646 struct app_dynamic_struct_visitor_ctx
*ctx
= (struct app_dynamic_struct_visitor_ctx
*) _ctx
;
647 uint32_t length
= ctx
->length
, i
;
649 for (i
= 0; i
< length
; i
++) {
650 struct side_arg_dynamic_event_field dynamic_field
= {
651 .field_name
= ctx
->ptr
[i
].name
,
653 .dynamic_type
= SIDE_DYNAMIC_TYPE_U32
,
655 .side_u32
= ctx
->ptr
[i
].value
,
659 if (tracer_ctx
->write_field(tracer_ctx
, &dynamic_field
) != SIDE_VISITOR_STATUS_OK
)
660 return SIDE_VISITOR_STATUS_ERROR
;
662 return SIDE_VISITOR_STATUS_OK
;
665 static struct struct_visitor_pair testarray_dynamic_struct
[] = {
673 void test_dynamic_struct_with_visitor(void)
675 my_provider_event_dynamic_struct_visitor
.enabled
= 1;
676 side_event_cond(&my_provider_event_dynamic_struct_visitor
) {
677 struct app_dynamic_struct_visitor_ctx ctx
= {
678 .ptr
= testarray_dynamic_struct
,
679 .length
= SIDE_ARRAY_SIZE(testarray_dynamic_struct
),
681 side_event_call(&my_provider_event_dynamic_struct_visitor
,
684 side_arg_dynamic_struct_visitor(test_dynamic_struct_visitor
, &ctx
)
691 static side_define_event(my_provider_event_user_attribute
, "myprovider", "myevent", SIDE_LOGLEVEL_DEBUG
,
693 side_attr("user_attribute_a", "val1"),
694 side_attr("user_attribute_b", "val2"),
697 side_field("abc", SIDE_TYPE_U32
, side_attr_list()),
698 side_field("def", SIDE_TYPE_S64
, side_attr_list()),
703 void test_event_user_attribute(void)
705 my_provider_event_user_attribute
.enabled
= 1;
706 side_event(&my_provider_event_user_attribute
, side_arg_list(side_arg_u32(1), side_arg_s64(2)));
716 test_vla_visitor_2d();
719 test_dynamic_basic_type();
722 test_dynamic_struct();
723 test_dynamic_nested_struct();
724 test_dynamic_vla_struct();
725 test_dynamic_struct_vla();
726 test_dynamic_nested_vla();
728 test_static_variadic();
731 test_dynamic_vla_with_visitor();
732 test_dynamic_struct_with_visitor();
733 test_event_user_attribute();