X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fust-app.c;h=0f8664cc3c65fd29471c1ef78786ddde8ee0fca7;hp=38d1d78713e6446dca9b55b001ccfbee376c88b3;hb=44760c20f4fc255b63894ca758cf2ee5f253220b;hpb=5d4193fd103743e68020148db71469b907020140 diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c index 38d1d7871..0f8664cc3 100644 --- a/src/bin/lttng-sessiond/ust-app.c +++ b/src/bin/lttng-sessiond/ust-app.c @@ -41,6 +41,7 @@ #include "lttng-sessiond.h" #include "notification-thread-commands.h" #include "rotate.h" +#include "event.h" struct lttng_ht *ust_app_ht; struct lttng_ht *ust_app_ht_by_sock; @@ -952,6 +953,7 @@ void delete_ust_app(struct ust_app *app) struct ust_app_session *ua_sess, *tmp_ua_sess; struct lttng_ht_iter iter; struct ust_app_event_notifier_rule *event_notifier_rule; + bool event_notifier_write_fd_is_open; /* * The session list lock must be held during this function to guarantee @@ -1009,7 +1011,16 @@ void delete_ust_app(struct ust_app *app) free(app->event_notifier_group.object); } + event_notifier_write_fd_is_open = lttng_pipe_is_write_open( + app->event_notifier_group.event_pipe); lttng_pipe_destroy(app->event_notifier_group.event_pipe); + /* + * Release the file descriptors reserved for the event notifier pipe. + * The app could be destroyed before the write end of the pipe could be + * passed to the application (and closed). In that case, both file + * descriptors must be released. + */ + lttng_fd_put(LTTNG_FD_APPS, event_notifier_write_fd_is_open ? 2 : 1); /* * Wait until we have deleted the application from the sock hash table @@ -1306,29 +1317,6 @@ error: return NULL; } -/* - * Allocate a filter and copy the given original filter. - * - * Return allocated filter or NULL on error. - */ -static struct lttng_filter_bytecode *copy_filter_bytecode( - struct lttng_filter_bytecode *orig_f) -{ - struct lttng_filter_bytecode *filter = NULL; - - /* Copy filter bytecode */ - filter = zmalloc(sizeof(*filter) + orig_f->len); - if (!filter) { - PERROR("zmalloc alloc filter bytecode"); - goto error; - } - - memcpy(filter, orig_f, sizeof(*filter) + orig_f->len); - -error: - return filter; -} - /* * Create a liblttng-ust filter bytecode from given bytecode. * @@ -1934,43 +1922,57 @@ static int init_ust_event_notifier_from_event_rule( memset(event_notifier, 0, sizeof(*event_notifier)); - status = lttng_event_rule_tracepoint_get_pattern(rule, &pattern); - if (status != LTTNG_EVENT_RULE_STATUS_OK) { - /* At this point, this is a fatal error. */ - abort(); - } + if (lttng_event_rule_targets_agent_domain(rule)) { + /* + * Special event for agents + * The actual meat of the event is in the filter that will be + * attached later on. + * Set the default values for the agent event. + */ + pattern = event_get_default_agent_ust_name( + lttng_event_rule_get_domain_type(rule)); + loglevel = 0; + ust_loglevel_type = LTTNG_UST_LOGLEVEL_ALL; + } else { + status = lttng_event_rule_tracepoint_get_pattern( + rule, &pattern); + if (status != LTTNG_EVENT_RULE_STATUS_OK) { + /* At this point, this is a fatal error. */ + abort(); + } - status = lttng_event_rule_tracepoint_get_log_level_type( - rule, &loglevel_type); - if (status != LTTNG_EVENT_RULE_STATUS_OK) { - /* At this point, this is a fatal error. */ - abort(); - } + status = lttng_event_rule_tracepoint_get_log_level_type( + rule, &loglevel_type); + if (status != LTTNG_EVENT_RULE_STATUS_OK) { + /* At this point, this is a fatal error. */ + abort(); + } - switch (loglevel_type) { - case LTTNG_EVENT_LOGLEVEL_ALL: - ust_loglevel_type = LTTNG_UST_LOGLEVEL_ALL; - break; - case LTTNG_EVENT_LOGLEVEL_RANGE: - ust_loglevel_type = LTTNG_UST_LOGLEVEL_RANGE; - break; - case LTTNG_EVENT_LOGLEVEL_SINGLE: - ust_loglevel_type = LTTNG_UST_LOGLEVEL_SINGLE; - break; - default: - /* Unknown log level specification type. */ - abort(); - } + switch (loglevel_type) { + case LTTNG_EVENT_LOGLEVEL_ALL: + ust_loglevel_type = LTTNG_UST_LOGLEVEL_ALL; + break; + case LTTNG_EVENT_LOGLEVEL_RANGE: + ust_loglevel_type = LTTNG_UST_LOGLEVEL_RANGE; + break; + case LTTNG_EVENT_LOGLEVEL_SINGLE: + ust_loglevel_type = LTTNG_UST_LOGLEVEL_SINGLE; + break; + default: + /* Unknown log level specification type. */ + abort(); + } - if (loglevel_type != LTTNG_EVENT_LOGLEVEL_ALL) { - status = lttng_event_rule_tracepoint_get_log_level( - rule, &loglevel); - assert(status == LTTNG_EVENT_RULE_STATUS_OK); + if (loglevel_type != LTTNG_EVENT_LOGLEVEL_ALL) { + status = lttng_event_rule_tracepoint_get_log_level( + rule, &loglevel); + assert(status == LTTNG_EVENT_RULE_STATUS_OK); + } } event_notifier->event.instrumentation = LTTNG_UST_TRACEPOINT; ret = lttng_strncpy(event_notifier->event.name, pattern, - LTTNG_UST_SYM_NAME_LEN - 1); + LTTNG_UST_SYM_NAME_LEN - 1); if (ret) { ERR("Failed to copy event rule pattern to notifier: pattern = '%s' ", pattern); @@ -2109,7 +2111,7 @@ static void shadow_copy_event(struct ust_app_event *ua_event, /* Copy filter bytecode */ if (uevent->filter) { - ua_event->filter = copy_filter_bytecode(uevent->filter); + ua_event->filter = lttng_filter_bytecode_copy(uevent->filter); /* Filter might be NULL here in case of ENONEM. */ } @@ -3708,6 +3710,7 @@ error: */ struct ust_app *ust_app_create(struct ust_register_msg *msg, int sock) { + int ret; struct ust_app *lta = NULL; struct lttng_pipe *event_notifier_event_source_pipe = NULL; @@ -3726,6 +3729,18 @@ struct ust_app *ust_app_create(struct ust_register_msg *msg, int sock) goto error; } + /* + * Reserve the two file descriptors of the event source pipe. The write + * end will be closed once it is passed to the application, at which + * point a single 'put' will be performed. + */ + ret = lttng_fd_get(LTTNG_FD_APPS, 2); + if (ret) { + ERR("Failed to reserve two file descriptors for the event source pipe while creating a new application instance: app = '%s' (ppid: %d)", + msg->name, (int) msg->ppid); + goto error; + } + event_notifier_event_source_pipe = lttng_pipe_open(FD_CLOEXEC); if (!event_notifier_event_source_pipe) { PERROR("Failed to open application event source pipe: '%s' (ppid = %d)", @@ -3783,6 +3798,7 @@ struct ust_app *ust_app_create(struct ust_register_msg *msg, int sock) error_free_pipe: lttng_pipe_destroy(event_notifier_event_source_pipe); + lttng_fd_put(LTTNG_FD_APPS, 2); error: return NULL; } @@ -3892,6 +3908,12 @@ int ust_app_setup_event_notifier_group(struct ust_app *app) goto error; } + /* + * Release the file descriptor that was reserved for the write-end of + * the pipe. + */ + lttng_fd_put(LTTNG_FD_APPS, 1); + lttng_ret = notification_thread_command_add_tracer_event_source( notification_thread_handle, lttng_pipe_get_readfd(app->event_notifier_group.event_pipe),