static
void tracer_print_dynamic(const struct side_arg_dynamic_vec *dynamic_item);
+static
+void print_attributes(const char *prefix_str, const struct side_attr *attr, uint32_t nr_attr)
+{
+ int i;
+
+ if (!nr_attr)
+ return;
+ printf("%s[ ", prefix_str);
+ for (i = 0; i < nr_attr; i++) {
+ printf("%s", i ? ", " : "");
+ printf("{ key: \"%s\", value: \"%s\" }",
+ attr[i].key, attr[i].value);
+ }
+ printf(" ]");
+}
+
static
void tracer_print_type(const struct side_type_description *type_desc, const struct side_arg_vec *item)
{
}
break;
}
+ printf("{ ");
+ print_attributes("attr: ", type_desc->attr, type_desc->nr_attr);
+ printf("%s", type_desc->nr_attr ? ", " : "");
+ printf("value: ");
switch (item->type) {
case SIDE_TYPE_BOOL:
printf("%s", item->u.side_bool ? "true" : "false");
printf("<UNKNOWN TYPE>");
abort();
}
+ printf(" }");
}
static
printf(" ]");
}
+struct tracer_dynamic_struct_visitor_priv {
+ int i;
+};
+
+static
+enum side_visitor_status tracer_dynamic_struct_write_elem_cb(
+ const struct side_tracer_dynamic_struct_visitor_ctx *tracer_ctx,
+ const struct side_arg_dynamic_event_field *dynamic_field)
+{
+ struct tracer_dynamic_struct_visitor_priv *tracer_priv = tracer_ctx->priv;
+
+ printf("%s", tracer_priv->i++ ? ", " : "");
+ printf("%s:: ", dynamic_field->field_name);
+ tracer_print_dynamic(&dynamic_field->elem);
+ return SIDE_VISITOR_STATUS_OK;
+}
+
static
void tracer_print_dynamic_struct_visitor(const struct side_arg_dynamic_vec *item)
{
- //TODO
+ enum side_visitor_status status;
+ struct tracer_dynamic_struct_visitor_priv tracer_priv = {
+ .i = 0,
+ };
+ const struct side_tracer_dynamic_struct_visitor_ctx tracer_ctx = {
+ .write_field = tracer_dynamic_struct_write_elem_cb,
+ .priv = &tracer_priv,
+ };
+ void *app_ctx = item->u.side_dynamic_struct_visitor.app_ctx;
+
+ printf("[ ");
+ status = item->u.side_dynamic_struct_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
abort();
}
printf(" ]");
-
}
static
void tracer_print_dynamic(const struct side_arg_dynamic_vec *item)
{
+ printf("{ ");
+ print_attributes("attr: ", item->attr, item->nr_attr);
+ printf("%s", item->nr_attr ? ", " : "");
+ printf("value: ");
switch (item->dynamic_type) {
case SIDE_DYNAMIC_TYPE_NULL:
printf("<NULL TYPE>");
printf("<UNKNOWN TYPE>");
abort();
}
+ printf(" }");
}
static
uint32_t side_sav_len = sav_desc->len;
int i;
- printf("provider: %s, event: %s, ", desc->provider_name, desc->event_name);
+ printf("provider: %s, event: %s", desc->provider_name, desc->event_name);
if (desc->nr_fields != side_sav_len) {
printf("ERROR: number of fields mismatch between description and arguments\n");
abort();
}
+ print_attributes(", attributes: ", desc->attr, desc->nr_attr);
+ printf("%s", side_sav_len ? ", fields: [ " : "");
for (i = 0; i < side_sav_len; i++) {
printf("%s", i ? ", " : "");
tracer_print_field(&desc->fields[i], &sav[i]);
void tracer_call(const struct side_event_description *desc, const struct side_arg_vec_description *sav_desc)
{
+ int nr_fields = 0;
+
if (side_unlikely(desc->flags & SIDE_EVENT_FLAG_VARIADIC)) {
printf("ERROR: unexpected variadic event description\n");
abort();
}
- tracer_print_static_fields(desc, sav_desc, NULL);
+ tracer_print_static_fields(desc, sav_desc, &nr_fields);
+ if (nr_fields)
+ printf(" ]");
printf("\n");
}
printf("ERROR: unexpected non-variadic event description\n");
abort();
}
+ printf("%s", var_struct_len && !nr_fields ? ", fields: [ " : "");
for (i = 0; i < var_struct_len; i++, nr_fields++) {
printf("%s", nr_fields ? ", " : "");
printf("%s:: ", var_struct->fields[i].field_name);
tracer_print_dynamic(&var_struct->fields[i].elem);
}
+ if (i)
+ printf(" ]");
printf("\n");
}