X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fsave.c;h=3df1f2828f17d275efcc69930030d1bd4cd25936;hp=ccd4a094335b3f0def7fce6942371584bc62eb38;hb=890d8fe47755c3bad936389cf48ffa141cff41c9;hpb=51755dc8c7607233c5f62b7931326d7d95df7910 diff --git a/src/bin/lttng-sessiond/save.c b/src/bin/lttng-sessiond/save.c index ccd4a0943..3df1f2828 100644 --- a/src/bin/lttng-sessiond/save.c +++ b/src/bin/lttng-sessiond/save.c @@ -15,7 +15,6 @@ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#define _GNU_SOURCE #define _LGPL_SOURCE #include #include @@ -742,16 +741,37 @@ end: } static -void init_ust_event_from_agent_event(struct ltt_ust_event *ust_event, +int init_ust_event_from_agent_event(struct ltt_ust_event *ust_event, struct agent_event *agent_event) { + int ret = 0; + enum lttng_ust_loglevel_type ust_loglevel_type; + ust_event->enabled = agent_event->enabled; ust_event->attr.instrumentation = LTTNG_UST_TRACEPOINT; strncpy(ust_event->attr.name, agent_event->name, LTTNG_SYMBOL_NAME_LEN); - ust_event->attr.loglevel_type = agent_event->loglevel_type; - ust_event->attr.loglevel = agent_event->loglevel; + switch (agent_event->loglevel_type) { + case LTTNG_EVENT_LOGLEVEL_ALL: + ust_loglevel_type = LTTNG_UST_LOGLEVEL_ALL; + break; + case LTTNG_EVENT_LOGLEVEL_SINGLE: + ust_loglevel_type = LTTNG_UST_LOGLEVEL_SINGLE; + break; + case LTTNG_EVENT_LOGLEVEL_RANGE: + ust_loglevel_type = LTTNG_UST_LOGLEVEL_RANGE; + break; + default: + ERR("Invalid agent_event loglevel_type."); + ret = -1; + goto end; + } + + ust_event->attr.loglevel_type = ust_loglevel_type; + ust_event->attr.loglevel = agent_event->loglevel_value; ust_event->filter_expression = agent_event->filter_expression; ust_event->exclusion = agent_event->exclusion; +end: + return ret; } static @@ -784,7 +804,11 @@ int save_agent_events(struct config_writer *writer, * (and one could wonder why they don't reuse the same * structures...). */ - init_ust_event_from_agent_event(&fake_event, agent_event); + ret = init_ust_event_from_agent_event(&fake_event, agent_event); + if (ret) { + rcu_read_unlock(); + goto end; + } ret = save_ust_event(writer, &fake_event); if (ret) { rcu_read_unlock(); @@ -1250,6 +1274,99 @@ const char *get_config_domain_str(enum lttng_domain_type domain) return str_dom; } +static +int save_pid_tracker(struct config_writer *writer, + struct ltt_session *sess, int domain) +{ + int ret = 0; + ssize_t nr_pids = 0, i; + int32_t *pids = NULL; + + switch (domain) { + case LTTNG_DOMAIN_KERNEL: + { + nr_pids = kernel_list_tracker_pids(sess->kernel_session, &pids); + if (nr_pids < 0) { + ret = LTTNG_ERR_KERN_LIST_FAIL; + goto end; + } + break; + } + case LTTNG_DOMAIN_UST: + { + nr_pids = trace_ust_list_tracker_pids(sess->ust_session, &pids); + if (nr_pids < 0) { + ret = LTTNG_ERR_UST_LIST_FAIL; + goto end; + } + break; + } + case LTTNG_DOMAIN_JUL: + case LTTNG_DOMAIN_LOG4J: + case LTTNG_DOMAIN_PYTHON: + default: + ret = LTTNG_ERR_UNKNOWN_DOMAIN; + goto end; + } + + /* Only create a pid_tracker if enabled or untrack all */ + if (nr_pids != 1 || (nr_pids == 1 && pids[0] != -1)) { + ret = config_writer_open_element(writer, + config_element_pid_tracker); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } + + ret = config_writer_open_element(writer, + config_element_targets); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } + + for (i = 0; i < nr_pids; i++) { + ret = config_writer_open_element(writer, + config_element_target_pid); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } + + ret = config_writer_write_element_unsigned_int(writer, + config_element_pid, pids[i]); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } + + /* /pid_target */ + ret = config_writer_close_element(writer); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } + } + + /* /targets */ + ret = config_writer_close_element(writer); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } + + /* /pid_tracker */ + ret = config_writer_close_element(writer); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } + } +end: + free(pids); + return ret; +} + static int save_ust_domain(struct config_writer *writer, struct ltt_session *session, enum lttng_domain_type domain) @@ -1326,107 +1443,34 @@ int save_ust_domain(struct config_writer *writer, goto end; } - /* /domain */ - ret = config_writer_close_element(writer); - if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; - goto end; - } - -end: - return ret; -} - -static -int save_pid_tracker(struct config_writer *writer, - struct ltt_session *sess, int domain) -{ - int ret = 0; - ssize_t nr_pids = 0, i; - int32_t *pids = NULL; - - switch (domain) { - case LTTNG_DOMAIN_KERNEL: - { - nr_pids = kernel_list_tracker_pids(sess->kernel_session, &pids); - if (nr_pids < 0) { - ret = LTTNG_ERR_KERN_LIST_FAIL; - goto end; - } - break; - } - case LTTNG_DOMAIN_UST: - { - nr_pids = trace_ust_list_tracker_pids(sess->ust_session, &pids); - if (nr_pids < 0) { - ret = LTTNG_ERR_UST_LIST_FAIL; - goto end; - } - break; - } - case LTTNG_DOMAIN_JUL: - case LTTNG_DOMAIN_LOG4J: - case LTTNG_DOMAIN_PYTHON: - default: - ret = LTTNG_ERR_UNKNOWN_DOMAIN; - goto end; - } - - /* Only create a pid_tracker if enabled or untrack all */ - if (nr_pids != 1 || (nr_pids == 1 && pids[0] != -1)) { + if (domain == LTTNG_DOMAIN_UST) { ret = config_writer_open_element(writer, - config_element_pid_tracker); + config_element_trackers); if (ret) { ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } - ret = config_writer_open_element(writer, - config_element_targets); + ret = save_pid_tracker(writer, session, LTTNG_DOMAIN_UST); if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } - for (i = 0; i < nr_pids; i++) { - ret = config_writer_open_element(writer, - config_element_target_pid); - if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; - goto end; - } - - ret = config_writer_write_element_unsigned_int(writer, - config_element_pid, pids[i]); - if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; - goto end; - } - - /* /pid_target */ - ret = config_writer_close_element(writer); - if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; - goto end; - } - } - - /* /targets */ + /* /trackers */ ret = config_writer_close_element(writer); if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + } - /* /pid_tracker */ - ret = config_writer_close_element(writer); - if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; - goto end; - } + /* /domain */ + ret = config_writer_close_element(writer); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; } + end: - free(pids); return ret; } @@ -1494,24 +1538,6 @@ int save_domains(struct config_writer *writer, struct ltt_session *session) goto end; } - ret = config_writer_open_element(writer, - config_element_trackers); - if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; - goto end; - } - - ret = save_pid_tracker(writer, session, LTTNG_DOMAIN_UST); - if (ret) { - goto end; - } - - /* /trackers */ - ret = config_writer_close_element(writer); - if (ret) { - goto end; - } - ret = save_ust_domain(writer, session, LTTNG_DOMAIN_JUL); if (ret) { goto end;