From 8ceca0cddeafb77d3bee82c9ed0e54bb3929641b Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Mon, 17 Oct 2022 09:37:40 -0400 Subject: [PATCH] Implement dynamic vla visitor Signed-off-by: Mathieu Desnoyers --- include/side/trace.h | 16 ++++++++----- src/test.c | 53 ++++++++++++++++++++++++++++++++++++++++++++ src/tracer.c | 38 ++++++++++++++++++++++++++++++- 3 files changed, 100 insertions(+), 7 deletions(-) diff --git a/include/side/trace.h b/include/side/trace.h index 44e21c7..a36599e 100644 --- a/include/side/trace.h +++ b/include/side/trace.h @@ -178,13 +178,13 @@ struct side_arg_dynamic_vec { const struct side_arg_dynamic_event_struct *side_dynamic_struct; struct { - void *app_dynamic_visitor_ctx; + void *app_ctx; side_dynamic_struct_visitor visitor; } side_dynamic_struct_visitor; const struct side_arg_dynamic_vec_vla *side_dynamic_vla; struct { - void *app_dynamic_visitor_ctx; + void *app_ctx; side_dynamic_vla_visitor visitor; } side_dynamic_vla_visitor; } u; @@ -396,9 +396,11 @@ struct side_tracer_dynamic_vla_visitor_ctx { #define side_arg_dynamic_vla_visitor(_dynamic_vla_visitor, _ctx) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_VLA_VISITOR, \ - .app_dynamic_visitor_ctx = _ctx, \ .u = { \ - .vla_visitor = _dynamic_vla_visitor, \ + .side_dynamic_vla_visitor = { \ + .app_ctx = _ctx, \ + .visitor = _dynamic_vla_visitor, \ + }, \ }, \ } @@ -406,9 +408,11 @@ struct side_tracer_dynamic_vla_visitor_ctx { #define side_arg_dynamic_struct_visitor(_dynamic_struct_visitor, _ctx) \ { \ .dynamic_type = SIDE_DYNAMIC_TYPE_STRUCT_VISITOR, \ - .app_dynamic_visitor_ctx = _ctx, \ .u = { \ - .struct_visitor = _dynamic_struct_visitor, \ + .side_dynamic_struct_visitor = { \ + .app_ctx = _ctx, \ + .visitor = _dynamic_struct_visitor, \ + }, \ }, \ } diff --git a/src/test.c b/src/test.c index 0039a58..4ea2b5f 100644 --- a/src/test.c +++ b/src/test.c @@ -543,6 +543,58 @@ void test_dynamic_bool(void) ); } +static side_define_event(my_provider_event_dynamic_vla_visitor, + "myprovider", "mydynamicvlavisitor", SIDE_LOGLEVEL_DEBUG, + side_field_list( + side_field("dynamic", SIDE_TYPE_DYNAMIC), + ) +); + +struct app_dynamic_vla_visitor_ctx { + const uint32_t *ptr; + uint32_t length; +}; + +static +enum side_visitor_status test_dynamic_vla_visitor(const struct side_tracer_dynamic_vla_visitor_ctx *tracer_ctx, void *_ctx) +{ + struct app_dynamic_vla_visitor_ctx *ctx = (struct app_dynamic_vla_visitor_ctx *) _ctx; + uint32_t length = ctx->length, i; + + for (i = 0; i < length; i++) { + const struct side_arg_dynamic_vec elem = { + .dynamic_type = SIDE_DYNAMIC_TYPE_U32, + .u = { + .side_u32 = ctx->ptr[i], + }, + }; + if (tracer_ctx->write_elem(tracer_ctx, &elem) != SIDE_VISITOR_STATUS_OK) + return SIDE_VISITOR_STATUS_ERROR; + } + return SIDE_VISITOR_STATUS_OK; +} + +static uint32_t testarray_dynamic_vla[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + +static +void test_dynamic_vla_with_visitor(void) +{ + my_provider_event_dynamic_vla_visitor.enabled = 1; + side_event_cond(&my_provider_event_dynamic_vla_visitor) { + struct app_dynamic_vla_visitor_ctx ctx = { + .ptr = testarray_dynamic_vla, + .length = SIDE_ARRAY_SIZE(testarray_dynamic_vla), + }; + side_event_call(&my_provider_event_dynamic_vla_visitor, + side_arg_list( + side_arg_dynamic( + side_arg_dynamic_vla_visitor(test_dynamic_vla_visitor, &ctx) + ) + ) + ); + } +} + int main() { test_fields(); @@ -565,5 +617,6 @@ int main() test_static_variadic(); test_bool(); test_dynamic_bool(); + test_dynamic_vla_with_visitor(); return 0; } diff --git a/src/tracer.c b/src/tracer.c index 599b248..1e161c8 100644 --- a/src/tracer.c +++ b/src/tracer.c @@ -461,10 +461,46 @@ void tracer_print_dynamic_vla(const struct side_arg_dynamic_vec_vla *vla) printf(" ]"); } +struct tracer_dynamic_vla_visitor_priv { + int i; +}; + +static +enum side_visitor_status tracer_dynamic_vla_write_elem_cb( + const struct side_tracer_dynamic_vla_visitor_ctx *tracer_ctx, + const struct side_arg_dynamic_vec *elem) +{ + struct tracer_dynamic_vla_visitor_priv *tracer_priv = tracer_ctx->priv; + + printf("%s", tracer_priv->i++ ? ", " : ""); + tracer_print_dynamic(elem); + return SIDE_VISITOR_STATUS_OK; +} + static void tracer_print_dynamic_vla_visitor(const struct side_arg_dynamic_vec *item) { - //TODO + enum side_visitor_status status; + struct tracer_dynamic_vla_visitor_priv tracer_priv = { + .i = 0, + }; + const struct side_tracer_dynamic_vla_visitor_ctx tracer_ctx = { + .write_elem = tracer_dynamic_vla_write_elem_cb, + .priv = &tracer_priv, + }; + void *app_ctx = item->u.side_dynamic_vla_visitor.app_ctx; + + printf("[ "); + status = item->u.side_dynamic_vla_visitor.visitor(&tracer_ctx, app_ctx); + switch (status) { + case SIDE_VISITOR_STATUS_OK: + break; + case SIDE_VISITOR_STATUS_ERROR: + printf("ERROR: Visitor error\n"); + abort(); + } + printf(" ]"); + } static -- 2.34.1