X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=lttng-sessiond%2Fevent.c;h=c8274c6bcf8a9100aed41422ff9db96734c01cf9;hp=4e6ac03bf19f58a4761b63c973ba6bac6bf25a24;hb=7f79d3a151871c5bab5bf47aae4eec5f9da1eab7;hpb=045e5491d29048a9d888559cd91d6d6f304fc171 diff --git a/lttng-sessiond/event.c b/lttng-sessiond/event.c index 4e6ac03bf..c8274c6bc 100644 --- a/lttng-sessiond/event.c +++ b/lttng-sessiond/event.c @@ -245,6 +245,12 @@ end: return ret; } +/* + * ============================ + * UST : The Ultimate Frontier! + * ============================ + */ + /* * Enable all UST tracepoints for a channel from a UST session. */ @@ -255,7 +261,7 @@ int event_ust_enable_all_tracepoints(struct ltt_ust_session *usess, int domain, size_t size; struct cds_lfht_iter iter; struct ltt_ust_event *uevent = NULL; - struct lttng_event *events; + struct lttng_event *events = NULL; switch (domain) { case LTTNG_DOMAIN_UST: @@ -301,7 +307,7 @@ int event_ust_enable_all_tracepoints(struct ltt_ust_session *usess, int domain, uevent = trace_ust_create_event(&events[i]); if (uevent == NULL) { ret = LTTCOMM_FATAL; - goto error; + goto error_destroy; } /* Create event for the specific PID */ @@ -310,10 +316,11 @@ int event_ust_enable_all_tracepoints(struct ltt_ust_session *usess, int domain, if (ret < 0) { if (ret == -EEXIST) { ret = LTTCOMM_UST_EVENT_EXIST; + goto error; } else { ret = LTTCOMM_UST_ENABLE_FAIL; + goto error_destroy; } - goto error; } uevent->enabled = 1; @@ -336,8 +343,11 @@ int event_ust_enable_all_tracepoints(struct ltt_ust_session *usess, int domain, return LTTCOMM_OK; -error: +error_destroy: trace_ust_destroy_event(uevent); + +error: + free(events); return ret; } @@ -360,6 +370,12 @@ int event_ust_enable_tracepoint(struct ltt_ust_session *usess, int domain, to_create = 1; } + if (uevent->enabled) { + /* It's already enabled so everything is OK */ + ret = LTTCOMM_OK; + goto end; + } + switch (domain) { case LTTNG_DOMAIN_UST: { @@ -374,14 +390,12 @@ int event_ust_enable_tracepoint(struct ltt_ust_session *usess, int domain, if (ret < 0) { if (ret == -EEXIST) { ret = LTTCOMM_UST_EVENT_EXIST; + goto end; } else { ret = LTTCOMM_UST_ENABLE_FAIL; + goto error; } - goto error; } - - DBG("Event UST %s added to channel %s", uevent->attr.name, - uchan->name); break; } case LTTNG_DOMAIN_UST_EXEC_NAME: @@ -389,42 +403,140 @@ int event_ust_enable_tracepoint(struct ltt_ust_session *usess, int domain, case LTTNG_DOMAIN_UST_PID_FOLLOW_CHILDREN: default: ret = LTTCOMM_NOT_IMPLEMENTED; - goto error; + goto end; } uevent->enabled = 1; /* Add ltt ust event to channel */ - rcu_read_lock(); - hashtable_add_unique(uchan->events, &uevent->node); - rcu_read_unlock(); + if (to_create) { + rcu_read_lock(); + hashtable_add_unique(uchan->events, &uevent->node); + rcu_read_unlock(); + } - return LTTCOMM_OK; + ret = LTTCOMM_OK; + +end: + DBG("Event UST %s %s in channel %s", uevent->attr.name, + to_create ? "created" : "enabled", uchan->name); + + return ret; error: trace_ust_destroy_event(uevent); return ret; } -#ifdef DISABLE -int event_ust_disable_tracepoint(struct ltt_ust_session *ustsession, - struct ltt_ust_channel *ustchan, char *event_name) +/* + * Disable UST tracepoint of a channel from a UST session. + */ +int event_ust_disable_tracepoint(struct ltt_ust_session *usess, int domain, + struct ltt_ust_channel *uchan, char *event_name) { int ret; - struct ltt_ust_event *ustevent; + struct ltt_ust_event *uevent; - ustevent = trace_ust_find_event_by_name(ustchan->events, event_name); - if (ustevent == NULL) { - ret = LTTCOMM_NO_EVENT; - goto end; + uevent = trace_ust_find_event_by_name(uchan->events, event_name); + if (uevent == NULL) { + ret = LTTCOMM_UST_EVENT_NOT_FOUND; + goto error; } - //ret = ustctl_disable(ustsession->sock, ustevent->obj); - if (ret < 0) { - ret = LTTCOMM_UST_ENABLE_FAIL; + + if (uevent->enabled == 0) { + /* It's already enabled so everything is OK */ + ret = LTTCOMM_OK; goto end; } - ustevent->enabled = 0; + + switch (domain) { + case LTTNG_DOMAIN_UST: + ret = ust_app_disable_event_glb(usess, uchan, uevent); + if (ret < 0 && ret != -EEXIST) { + ret = LTTCOMM_UST_DISABLE_FAIL; + goto error; + } + 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->enabled = 0; ret = LTTCOMM_OK; + end: + DBG2("Event UST %s disabled in channel %s", uevent->attr.name, + uchan->name); + +error: + return ret; +} + +/* + * Disable all UST tracepoints for a channel from a UST session. + */ +int event_ust_disable_all_tracepoints(struct ltt_ust_session *usess, int domain, + struct ltt_ust_channel *uchan) +{ + int ret, i; + size_t size; + struct cds_lfht_iter iter; + struct ltt_ust_event *uevent = NULL; + struct lttng_event *events = NULL; + + switch (domain) { + case LTTNG_DOMAIN_UST: + { + /* Disabling existing events */ + cds_lfht_for_each_entry(uchan->events, &iter, uevent, node) { + if (uevent->enabled == 1) { + ret = ust_app_disable_event_glb(usess, uchan, uevent); + if (ret < 0) { + continue; + } + uevent->enabled = 0; + } + } + + /* Get all UST available events */ + size = ust_app_list_events(&events); + if (size < 0) { + ret = LTTCOMM_UST_LIST_FAIL; + goto error; + } + + for (i = 0; i < size; i++) { + uevent = trace_ust_find_event_by_name(uchan->events, + events[i].name); + if (uevent != NULL && uevent->enabled == 1) { + ret = ust_app_disable_event_pid(usess, uchan, uevent, + events[i].pid); + if (ret < 0 && ret != -EEXIST) { + ret = LTTCOMM_UST_DISABLE_FAIL; + goto error; + } + uevent->enabled = 0; + continue; + } + } + + free(events); + 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; + } + + return LTTCOMM_OK; + +error: + free(events); return ret; } -#endif