X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Ftrace-ust.c;h=b7ef806af1a5a218cdfa7ccc2f1b4c6e04691f98;hb=b953b8cd56dbdc30e9228a7334c6e5fbe302cfc7;hp=9bc0b73d05cdb80363e159d76d703b102bd88141;hpb=6addfa379ee608b20cfe5e15d135bcb6a9724e90;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/trace-ust.c b/src/bin/lttng-sessiond/trace-ust.c index 9bc0b73d0..b7ef806af 100644 --- a/src/bin/lttng-sessiond/trace-ust.c +++ b/src/bin/lttng-sessiond/trace-ust.c @@ -71,12 +71,14 @@ int trace_ust_ht_match_event(struct cds_lfht_node *node, const void *_key) { struct ltt_ust_event *event; const struct ltt_ust_ht_key *key; + int ev_loglevel_value; assert(node); assert(_key); event = caa_container_of(node, struct ltt_ust_event, node.node); key = _key; + ev_loglevel_value = event->attr.loglevel; /* Match the 4 elements of the key: name, filter, loglevel, exclusions. */ @@ -85,19 +87,21 @@ int trace_ust_ht_match_event(struct cds_lfht_node *node, const void *_key) goto no_match; } - /* Event loglevel. */ - if (event->attr.loglevel != key->loglevel) { - if (event->attr.loglevel_type == LTTNG_UST_LOGLEVEL_ALL - && key->loglevel == 0 && event->attr.loglevel == -1) { + /* Event loglevel value and type. */ + if (event->attr.loglevel_type == key->loglevel_type) { + /* Same loglevel type. */ + if (key->loglevel_type != LTTNG_UST_LOGLEVEL_ALL) { /* - * Match is accepted. This is because on event creation, the - * loglevel is set to -1 if the event loglevel type is ALL so 0 and - * -1 are accepted for this loglevel type since 0 is the one set by - * the API when receiving an enable event. + * Loglevel value must also match since the loglevel + * type is not all. */ - } else { - goto no_match; + if (ev_loglevel_value != key->loglevel_value) { + goto no_match; + } } + } else { + /* Loglevel type is different: no match. */ + goto no_match; } /* Only one of the filters is NULL, fail. */ @@ -171,7 +175,8 @@ error: * MUST be acquired before calling this. */ struct ltt_ust_event *trace_ust_find_event(struct lttng_ht *ht, - char *name, struct lttng_filter_bytecode *filter, int loglevel, + char *name, struct lttng_filter_bytecode *filter, + enum lttng_ust_loglevel_type loglevel_type, int loglevel_value, struct lttng_event_exclusion *exclusion) { struct lttng_ht_node_str *node; @@ -183,7 +188,8 @@ struct ltt_ust_event *trace_ust_find_event(struct lttng_ht *ht, key.name = name; key.filter = filter; - key.loglevel = loglevel; + key.loglevel_type = loglevel_type; + key.loglevel_value = loglevel_value; key.exclusion = exclusion; cds_lfht_lookup(ht->ht, ht->hash_fct((void *) name, lttng_ht_seed), @@ -788,7 +794,8 @@ int trace_ust_untrack_pid(struct ltt_ust_session *session, int pid) struct ust_app *app; if (!session->pid_tracker.ht) { - retval = LTTNG_ERR_INVALID; + /* No PID being tracked. */ + retval = LTTNG_ERR_PID_NOT_TRACKED; goto end; } /* Remove PID from tracker */ @@ -952,11 +959,6 @@ static void _trace_ust_destroy_channel(struct ltt_ust_channel *channel) 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); } @@ -975,6 +977,11 @@ static void destroy_channel_rcu(struct rcu_head *head) 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); } @@ -1000,18 +1007,18 @@ void trace_ust_delete_channel(struct lttng_ht *ht, */ 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();