attr = defattr;
}
+ /*
+ * Set the overwrite mode for this channel based on the session
+ * type unless the client explicitly overrides the channel mode.
+ */
+ if (attr->attr.overwrite == DEFAULT_CHANNEL_OVERWRITE) {
+ attr->attr.overwrite = !!ksession->snapshot_mode;
+ }
+
+ /* Enforce mmap output for snapshot sessions. */
if (ksession->snapshot_mode) {
- /* Force channel attribute for snapshot mode. */
- attr->attr.overwrite = 1;
attr->attr.output = LTTNG_EVENT_MMAP;
}
struct ltt_ust_channel *uchan = NULL;
struct lttng_channel *defattr = NULL;
enum lttng_domain_type domain = LTTNG_DOMAIN_UST;
+ bool chan_published = false;
assert(usess);
}
}
+ /*
+ * Set the overwrite mode for this channel based on the session
+ * type unless the client explicitly overrides the channel mode.
+ */
+ if (attr->attr.overwrite == DEFAULT_CHANNEL_OVERWRITE) {
+ attr->attr.overwrite = !!usess->snapshot_mode;
+ }
+
+ /* Enforce mmap output for snapshot sessions. */
if (usess->snapshot_mode) {
- /* Force channel attribute for snapshot mode. */
- attr->attr.overwrite = 1;
attr->attr.output = LTTNG_EVENT_MMAP;
}
if (strncmp(uchan->name, DEFAULT_METADATA_NAME,
sizeof(uchan->name))) {
lttng_ht_add_unique_str(usess->domain_global.channels, &uchan->node);
+ chan_published = true;
} else {
/*
* Copy channel attribute to session if this is metadata so if NO
agt = agent_create(domain);
if (!agt) {
ret = LTTNG_ERR_NOMEM;
- goto error_free_chan;
+ goto error_remove_chan;
}
agent_add(agt, usess->agents);
}
free(defattr);
return LTTNG_OK;
+error_remove_chan:
+ if (chan_published) {
+ trace_ust_delete_channel(usess->domain_global.channels, uchan);
+ }
error_free_chan:
- /*
- * No need to remove the channel from the hash table because at this point
- * it was not added hence the direct call and no call_rcu().
- */
trace_ust_destroy_channel(uchan);
error:
free(defattr);