X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;ds=inline;f=lttng-sessiond%2Fust-app.c;h=904fcc3b947b1195e52e34e59e8051667b4a2331;hb=90192ee7cea425e30bd065576612156dd6cf5608;hp=69164126beafbe15e276a7f694bc5dc2045cd7b9;hpb=ac3bd9c0d406b3230680d06ab189bcb95337b9cc;p=lttng-tools.git diff --git a/lttng-sessiond/ust-app.c b/lttng-sessiond/ust-app.c index 69164126b..904fcc3b9 100644 --- a/lttng-sessiond/ust-app.c +++ b/lttng-sessiond/ust-app.c @@ -1383,12 +1383,10 @@ int ust_app_list_events(struct lttng_event **events) while ((ret = ustctl_tracepoint_list_get(app->key.sock, handle, &iter)) != -ENOENT) { - memcpy(tmp[count].name, iter.name, LTTNG_UST_SYM_NAME_LEN); - /* TODO : get loglevel too */ - if (count > nbmem) { - DBG2("Reallocating event list from %zu to %zu bytes", nbmem, - nbmem + UST_APP_EVENT_LIST_SIZE); - nbmem += UST_APP_EVENT_LIST_SIZE; + if (count >= nbmem) { + DBG2("Reallocating event list from %zu to %zu entries", nbmem, + 2 * nbmem); + nbmem *= 2; tmp = realloc(tmp, nbmem * sizeof(struct lttng_event)); if (tmp == NULL) { PERROR("realloc ust app events"); @@ -1396,7 +1394,9 @@ int ust_app_list_events(struct lttng_event **events) goto rcu_error; } } - + 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; @@ -2253,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; +}