X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;ds=sidebyside;f=lttng-sessiond%2Fust-app.c;h=904fcc3b947b1195e52e34e59e8051667b4a2331;hb=330be774319277f86ecf9445603bf97dc3249ca3;hp=3847004d4349abe70e17a517cfeb8b07b8da3f23;hpb=815564d8f9c161183f092e40561cbb26f2024fc8;p=lttng-tools.git diff --git a/lttng-sessiond/ust-app.c b/lttng-sessiond/ust-app.c index 3847004d4..904fcc3b9 100644 --- a/lttng-sessiond/ust-app.c +++ b/lttng-sessiond/ust-app.c @@ -1383,7 +1383,6 @@ int ust_app_list_events(struct lttng_event **events) while ((ret = ustctl_tracepoint_list_get(app->key.sock, handle, &iter)) != -ENOENT) { - /* TODO : get loglevel too */ if (count >= nbmem) { DBG2("Reallocating event list from %zu to %zu entries", nbmem, 2 * nbmem); @@ -1396,6 +1395,8 @@ int ust_app_list_events(struct lttng_event **events) } } memcpy(tmp[count].name, iter.name, LTTNG_UST_SYM_NAME_LEN); + memcpy(tmp[count].loglevel, iter.loglevel, LTTNG_UST_SYM_NAME_LEN); + tmp[count].loglevel_value = iter.loglevel_value; tmp[count].type = LTTNG_UST_TRACEPOINT; tmp[count].pid = app->key.pid; tmp[count].enabled = -1; @@ -2252,3 +2253,61 @@ int ust_app_add_ctx_event_glb(struct ltt_ust_session *usess, rcu_read_unlock(); return ret; } + +/* + * Enable event for a channel from a UST session for a specific PID. + */ +int ust_app_enable_event_pid(struct ltt_ust_session *usess, + struct ltt_ust_channel *uchan, struct ltt_ust_event *uevent, pid_t pid) +{ + int ret = 0; + struct cds_lfht_iter iter; + struct cds_lfht_node *ua_chan_node, *ua_event_node; + struct ust_app *app; + struct ust_app_session *ua_sess; + struct ust_app_channel *ua_chan; + struct ust_app_event *ua_event; + + DBG("UST app enabling event %s for PID %d", uevent->attr.name, pid); + + rcu_read_lock(); + + app = ust_app_find_by_pid(pid); + if (app == NULL) { + ERR("UST app enable event per PID %d not found", pid); + ret = -1; + goto error; + } + + ua_sess = lookup_session_by_app(usess, app); + /* If ua_sess is NULL, there is a code flow error */ + assert(ua_sess); + + /* Lookup channel in the ust app session */ + ua_chan_node = hashtable_lookup(ua_sess->channels, (void *)uchan->name, + strlen(uchan->name), &iter); + /* If the channel is not found, there is a code flow error */ + assert(ua_chan_node); + + ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node); + + ua_event_node = hashtable_lookup(ua_sess->channels, + (void*)uevent->attr.name, strlen(uevent->attr.name), &iter); + if (ua_event_node == NULL) { + ret = create_ust_app_event(ua_sess, ua_chan, uevent, app); + if (ret < 0) { + goto error; + } + } else { + ua_event = caa_container_of(ua_event_node, struct ust_app_event, node); + + ret = enable_ust_app_event(ua_sess, ua_event, app); + if (ret < 0) { + goto error; + } + } + +error: + rcu_read_unlock(); + return ret; +}