+ /* Special case for PERF_*_COUNTER
+ * print the lttng_event_perf_counter_ctx*/
+ switch (context->ctx) {
+ case LTTNG_EVENT_CONTEXT_PERF_COUNTER:
+ case LTTNG_EVENT_CONTEXT_PERF_THREAD_COUNTER:
+ case LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER:
+ {
+ struct lttng_event_perf_counter_ctx *perf_context =
+ &context->u.perf_counter;
+ ret = mi_lttng_perf_counter_context(writer, perf_context);
+ if (ret) {
+ goto end;
+ }
+ break;
+ }
+ case LTTNG_EVENT_CONTEXT_APP_CONTEXT:
+ {
+ ret = mi_lttng_app_context(writer,
+ context->u.app_ctx.provider_name,
+ context->u.app_ctx.ctx_name);
+ if (ret) {
+ goto end;
+ }
+ break;
+ }
+ default:
+ {
+ const char *type_string = mi_lttng_event_contexttype_string(
+ context->ctx);
+ if (!type_string) {
+ ret = -LTTNG_ERR_INVALID;
+ goto end;
+ }
+
+ /* Print context type */
+ ret = mi_lttng_writer_write_element_string(writer,
+ config_element_type, type_string);
+ break;
+ }
+ }
+
+ /* Close context */
+ if (!is_open) {
+ ret = mi_lttng_writer_close_element(writer);
+ }
+