- for (i = 0; i < ctx->nr_fields; i++)
- ctx->fields[i].record(&ctx->fields[i], bufctx, chan);
+ lib_ring_buffer_align_ctx(bufctx, ctx->largest_align);
+ for (i = 0; i < ctx->nr_fields; i++) {
+ if (mode == APP_CTX_ENABLED) {
+ ctx->fields[i].record(&ctx->fields[i], bufctx, chan);
+ } else {
+ if (lttng_context_is_app(ctx->fields[i].event_field.name)) {
+ /*
+ * Before UST 2.8, we cannot use the
+ * application context, because we
+ * cannot trust that the handler used
+ * for get_size is the same used for
+ * ctx_record, which would result in
+ * corrupted traces when tracing
+ * concurrently with application context
+ * register/unregister.
+ */
+ lttng_ust_dummy_record(&ctx->fields[i], bufctx, chan);
+ } else {
+ ctx->fields[i].record(&ctx->fields[i], bufctx, chan);
+ }
+ }
+ }