+int save_ust_context_app_ctx(struct config_writer *writer,
+ struct ltt_ust_context *ctx)
+{
+ int ret;
+
+ assert(writer);
+ assert(ctx);
+
+ /* Application contexts are saved as application_context_type */
+ ret = config_writer_open_element(writer, config_element_context_app);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+
+ ret = config_writer_write_element_string(writer,
+ config_element_context_app_provider_name,
+ ctx->ctx.u.app_ctx.provider_name);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+
+ ret = config_writer_write_element_string(writer,
+ config_element_context_app_ctx_name,
+ ctx->ctx.u.app_ctx.ctx_name);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+
+ /* /app */
+ ret = config_writer_close_element(writer);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+end:
+ return ret;
+}
+
+static
+int save_ust_context_generic(struct config_writer *writer,
+ struct ltt_ust_context *ctx)
+{
+ int ret;
+ const char *context_type_string;
+
+ assert(writer);
+ assert(ctx);
+
+ /* Save context as event_context_type_type */
+ context_type_string = get_ust_context_type_string(
+ ctx->ctx.ctx);
+ if (!context_type_string) {
+ ERR("Unsupported UST context type.");
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+
+ ret = config_writer_write_element_string(writer,
+ config_element_type, context_type_string);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+end:
+ return ret;
+}
+
+static
+int save_ust_context(struct config_writer *writer,
+ struct cds_list_head *ctx_list)
+{
+ int ret;
+ struct ltt_ust_context *ctx;
+
+ assert(writer);
+ assert(ctx_list);
+
+ ret = config_writer_open_element(writer, config_element_contexts);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+
+ cds_list_for_each_entry(ctx, ctx_list, list) {
+ ret = config_writer_open_element(writer,
+ config_element_context);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+
+ switch (ctx->ctx.ctx) {
+ case LTTNG_UST_CONTEXT_PERF_THREAD_COUNTER:
+ ret = save_ust_context_perf_thread_counter(writer, ctx);
+ break;
+ case LTTNG_UST_CONTEXT_APP_CONTEXT:
+ ret = save_ust_context_app_ctx(writer, ctx);
+ break;
+ default:
+ /* Save generic context. */
+ ret = save_ust_context_generic(writer, ctx);
+ }
+ if (ret) {
+ goto end;
+ }
+
+ /* /context */
+ ret = config_writer_close_element(writer);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+ }
+
+ /* /contexts */
+ ret = config_writer_close_element(writer);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+end:
+ return ret;
+}
+
+static
+int save_kernel_channel(struct config_writer *writer,