goto error_consumer;
}
- /*
- * The tmp_consumer stays NULL until a set_consumer_uri command is
- * executed. At this point, the consumer should be nullify until an
- * enable_consumer command. This assignment is symbolic since we've zmalloc
- * the struct.
- */
- lus->tmp_consumer = NULL;
-
DBG2("UST trace session create successful");
return lus;
/*
* Allocate and initialize a ust event. Set name and event type.
+ * We own filter_expression, filter, and exclusion.
*
* Return pointer to structure or NULL.
*/
error_free_event:
free(lue);
error:
+ free(filter_expression);
+ free(filter);
+ free(exclusion);
return NULL;
}
utype = LTTNG_UST_CONTEXT_IP;
break;
case LTTNG_EVENT_CONTEXT_PERF_THREAD_COUNTER:
- utype = LTTNG_UST_CONTEXT_PERF_THREAD_COUNTER;
+ if (!ustctl_has_perf_counters()) {
+ utype = -1;
+ WARN("Perf counters not implemented in UST");
+ } else {
+ utype = LTTNG_UST_CONTEXT_PERF_THREAD_COUNTER;
+ }
break;
default:
ERR("Invalid UST context");
DBG2("Trace destroy UST channel %s", channel->name);
- /* Destroying all events of the channel */
- destroy_events(channel->events);
- /* Destroying all context of the channel */
- destroy_contexts(channel->ctx);
-
free(channel);
}
void trace_ust_destroy_channel(struct ltt_ust_channel *channel)
{
+ /* Destroying all events of the channel */
+ destroy_events(channel->events);
+ /* Destroying all context of the channel */
+ destroy_contexts(channel->ctx);
+
call_rcu(&channel->node.head, destroy_channel_rcu);
}
*/
static void destroy_channels(struct lttng_ht *channels)
{
- int ret;
struct lttng_ht_node_str *node;
struct lttng_ht_iter iter;
assert(channels);
rcu_read_lock();
-
cds_lfht_for_each_entry(channels->ht, &iter.iter, node, node) {
- ret = lttng_ht_del(channels, &iter);
- assert(!ret);
- call_rcu(&node->head, destroy_channel_rcu);
+ struct ltt_ust_channel *chan =
+ caa_container_of(node, struct ltt_ust_channel, node);
+
+ trace_ust_delete_channel(channels, chan);
+ trace_ust_destroy_channel(chan);
}
rcu_read_unlock();
/* Cleaning up UST domain */
destroy_domain_global(&session->domain_global);
+ rcu_read_lock();
cds_lfht_for_each_entry(session->agents->ht, &iter.iter, agt, node.node) {
lttng_ht_del(session->agents, &iter);
agent_destroy(agt);
}
+ rcu_read_unlock();
/* Cleanup UID buffer registry object(s). */
cds_list_for_each_entry_safe(reg, sreg, &session->buffer_reg_uid_list,
buffer_reg_uid_destroy(reg, session->consumer);
}
- consumer_destroy_output(session->consumer);
- consumer_destroy_output(session->tmp_consumer);
+ consumer_output_put(session->consumer);
free(session);
}