/*
* Add kernel context to all channel.
+ *
+ * Assumes the ownership of kctx.
*/
static int add_kctx_all_channels(struct ltt_kernel_session *ksession,
struct ltt_kernel_context *kctx)
/* Go over all channels */
cds_list_for_each_entry(kchan, &ksession->channel_list.head, list) {
- ret = kernel_add_channel_context(kchan, kctx);
- if (ret < 0) {
- ret = LTTNG_ERR_KERN_CONTEXT_FAIL;
+ struct ltt_kernel_context *kctx_copy;
+
+ kctx_copy = trace_kernel_copy_context(kctx);
+ if (!kctx_copy) {
+ PERROR("zmalloc ltt_kernel_context");
+ goto error;
+ }
+
+ /* Ownership of kctx_copy is transferred to the callee. */
+ ret = kernel_add_channel_context(kchan, kctx_copy);
+ kctx_copy = NULL;
+ if (ret != 0) {
goto error;
}
}
ret = LTTNG_OK;
error:
+ trace_kernel_destroy_context(kctx);
return ret;
}
/*
* Add kernel context to a specific channel.
+ *
+ * Assumes the ownership of kctx.
*/
static int add_kctx_to_channel(struct ltt_kernel_context *kctx,
struct ltt_kernel_channel *kchan)
DBG("Add kernel context to channel '%s'", kchan->channel->name);
+ /* Ownership of kctx is transferred to the callee. */
ret = kernel_add_channel_context(kchan, kctx);
- if (ret < 0) {
- ret = LTTNG_ERR_KERN_CONTEXT_FAIL;
+ kctx = NULL;
+ if (ret != 0) {
goto error;
}
case LTTNG_EVENT_CONTEXT_PERF_COUNTER:
kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_PERF_CPU_COUNTER;
break;
+ case LTTNG_EVENT_CONTEXT_INTERRUPTIBLE:
+ kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_INTERRUPTIBLE;
+ break;
+ case LTTNG_EVENT_CONTEXT_PREEMPTIBLE:
+ kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_PREEMPTIBLE;
+ break;
+ case LTTNG_EVENT_CONTEXT_NEED_RESCHEDULE:
+ kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_NEED_RESCHEDULE;
+ break;
+ case LTTNG_EVENT_CONTEXT_MIGRATABLE:
+ kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_MIGRATABLE;
+ break;
default:
ret = LTTNG_ERR_KERN_CONTEXT_FAIL;
goto error;
if (*channel_name == '\0') {
ret = add_kctx_all_channels(ksession, kctx);
+ /* Ownership of kctx is transferred to the callee. */
+ kctx = NULL;
if (ret != LTTNG_OK) {
goto error;
}
}
ret = add_kctx_to_channel(kctx, kchan);
+ /* Ownership of kctx is transferred to the callee. */
+ kctx = NULL;
if (ret != LTTNG_OK) {
goto error;
}
}
- return LTTNG_OK;
+ ret = LTTNG_OK;
error:
if (kctx) {