X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=lttng-sessiond%2Fevent.c;h=407f8441c60bb7ffd8bae71448498879738b47b3;hp=2d1fb6e6834a440cfefd2f306b01d22df336831b;hb=edb6738816b442fb81f12ea0079260c96c3a5759;hpb=3b25d04d4b29a50147e9b42b475153d7b80d1dff diff --git a/lttng-sessiond/event.c b/lttng-sessiond/event.c index 2d1fb6e68..407f8441c 100644 --- a/lttng-sessiond/event.c +++ b/lttng-sessiond/event.c @@ -28,6 +28,9 @@ #include "hashtable.h" #include "kernel.h" #include "ust-ctl.h" +#include "ust-app.h" +#include "trace-kernel.h" +#include "trace-ust.h" /* * Setup a lttng_event used to enable *all* syscall tracing. @@ -236,35 +239,66 @@ end: /* * Enable UST tracepoint event for a channel from a UST session. */ -#ifdef DISABLE -int event_ust_enable_tracepoint(struct ltt_ust_session *usess, - struct ltt_ust_channel *uchan, struct ltt_ust_event *uevent) +int event_ust_enable_tracepoint(struct ltt_ust_session *usess, int domain, + struct ltt_ust_channel *uchan, struct lttng_event *event) { - int ret; - struct lttng_ust_event ltt_uevent; - struct object_data *obj_event; + int ret, to_create = 0; + struct ltt_ust_event *uevent; + + uevent = trace_ust_find_event_by_name(uchan->events, event->name); + if (uevent == NULL) { + uevent = trace_ust_create_event(event); + if (uevent == NULL) { + ret = LTTCOMM_FATAL; + goto error; + } + to_create = 1; + } - strncpy(ltt_uevent.name, uevent->attr.name, sizeof(ltt_uevent.name)); - ltt_uevent.name[sizeof(ltt_uevent.name) - 1] = '\0'; - /* TODO: adjust to other instrumentation types */ - ltt_uevent.instrumentation = LTTNG_UST_TRACEPOINT; + switch (domain) { + case LTTNG_DOMAIN_UST: + { + if (to_create) { + /* Create event on all UST registered apps for session */ + ret = ust_app_create_event_all(usess, uchan, uevent); + } else { + /* Enable event on all UST registered apps for session */ + ret = ust_app_enable_event_all(usess, uchan, uevent); + } - ret = ustctl_create_event(app->key.sock, <t_uevent, - uchan->obj, &obj_event); - if (ret < 0) { - DBG("Error ustctl create event %s for app pid: %d, sock: %d ret %d", - uevent->attr.name, app->key.pid, app->key.sock, ret); - goto next; + if (ret < 0) { + if (ret == -EEXIST) { + ret = LTTCOMM_UST_EVENT_EXIST; + } else { + ret = LTTCOMM_UST_ENABLE_FAIL; + } + goto error; + } + + DBG("Event UST %s added to channel %s", uevent->attr.name, + uchan->name); + break; + } + case LTTNG_DOMAIN_UST_EXEC_NAME: + case LTTNG_DOMAIN_UST_PID: + case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN: + default: + ret = LTTCOMM_NOT_IMPLEMENTED; + goto error; } - uevent->obj = obj_event; - uevent->handle = obj_event->handle; uevent->enabled = 1; - ret = LTTCOMM_OK; -end: + /* Add ltt ust event to channel */ + rcu_read_lock(); + hashtable_add_unique(uchan->events, &uevent->node); + rcu_read_unlock(); + + return LTTCOMM_OK; + +error: + trace_ust_destroy_event(uevent); return ret; } -#endif #ifdef DISABLE int event_ust_disable_tracepoint(struct ltt_ust_session *ustsession,