X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng%2Futils.c;h=e836943991da04d16c9c0764230cd4e3ca6367e6;hp=81e93952ad139ad9466a9723099a7884d0911c5c;hb=1004b7191b421c7c07acf964d0110d93bb022699;hpb=a1e4ab8b82429320c5f962038c0f28b874f8ea6f diff --git a/src/bin/lttng/utils.c b/src/bin/lttng/utils.c index 81e93952a..e83694399 100644 --- a/src/bin/lttng/utils.c +++ b/src/bin/lttng/utils.c @@ -1,18 +1,8 @@ /* - * Copyright (c) 2011 David Goulet + * Copyright (C) 2011 David Goulet * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2 only, - * as published by the Free Software Foundation. + * SPDX-License-Identifier: GPL-2.0-only * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define _LGPL_SOURCE @@ -36,11 +26,6 @@ #include "utils.h" #include "command.h" -static const char *str_kernel = "Kernel"; -static const char *str_ust = "UST"; -static const char *str_jul = "JUL"; -static const char *str_log4j = "LOG4J"; -static const char *str_python = "Python"; static const char *str_all = "ALL"; static const char *str_tracepoint = "Tracepoint"; static const char *str_syscall = "Syscall"; @@ -138,6 +123,24 @@ void list_cmd_options(FILE *ofp, struct poptOption *options) } } +/* + * Same as list_cmd_options, but for options specified for argpar. + */ +void list_cmd_options_argpar(FILE *ofp, const struct argpar_opt_descr *options) +{ + int i; + + for (i = 0; options[i].long_name != NULL; i++) { + const struct argpar_opt_descr *option = &options[i]; + + fprintf(ofp, "--%s\n", option->long_name); + + if (isprint(option->short_name)) { + fprintf(ofp, "-%c\n", option->short_name); + } + } +} + /* * fls: returns the position of the most significant bit. * Returns 0 if no bit is set, else returns the position of the most @@ -290,34 +293,6 @@ int get_count_order_ulong(unsigned long x) return fls_ulong(x - 1); } -const char *get_domain_str(enum lttng_domain_type domain) -{ - const char *str_dom; - - switch (domain) { - case LTTNG_DOMAIN_KERNEL: - str_dom = str_kernel; - break; - case LTTNG_DOMAIN_UST: - str_dom = str_ust; - break; - case LTTNG_DOMAIN_JUL: - str_dom = str_jul; - break; - case LTTNG_DOMAIN_LOG4J: - str_dom = str_log4j; - break; - case LTTNG_DOMAIN_PYTHON: - str_dom = str_python; - break; - default: - /* Should not have an unknown domain or else define it. */ - assert(0); - } - - return str_dom; -} - const char *get_event_type_str(enum lttng_event_type type) { const char *str_event_type; @@ -442,15 +417,19 @@ error_socket: return ret; } -int print_missing_or_multiple_domains(unsigned int sum) +int print_missing_or_multiple_domains(unsigned int domain_count, + bool include_agent_domains) { int ret = 0; - if (sum == 0) { - ERR("Please specify a domain (-k/-u/-j)."); + if (domain_count == 0) { + ERR("Please specify a domain (--kernel/--userspace%s).", + include_agent_domains ? + "/--jul/--log4j/--python" : + ""); ret = -1; - } else if (sum > 1) { - ERR("Multiple domains specified."); + } else if (domain_count > 1) { + ERR("Only one domain must be specified."); ret = -1; } @@ -462,16 +441,30 @@ int print_missing_or_multiple_domains(unsigned int sum) */ void print_session_stats(const char *session_name) { - int count, nb_domains, domain_idx, channel_idx, session_idx; + char *str; + const int ret = get_session_stats_str(session_name, &str); + + if (ret >= 0 && str) { + MSG("%s", str); + free(str); + } +} + +int get_session_stats_str(const char *session_name, char **out_str) +{ + int count, nb_domains, domain_idx, channel_idx, session_idx, ret; struct lttng_domain *domains; struct lttng_channel *channels; uint64_t discarded_events_total = 0, lost_packets_total = 0; struct lttng_session *sessions = NULL; const struct lttng_session *selected_session = NULL; + char *stats_str = NULL; + bool print_discarded_events = false, print_lost_packets = false; count = lttng_list_sessions(&sessions); if (count < 1) { ERR("Failed to retrieve session descriptions while printing session statistics."); + ret = -1; goto end; } @@ -484,11 +477,13 @@ void print_session_stats(const char *session_name) } if (!selected_session) { ERR("Failed to retrieve session \"%s\" description while printing session statistics.", session_name); + ret = -1; goto end; } nb_domains = lttng_list_domains(session_name, &domains); if (nb_domains < 0) { + ret = -1; goto end; } for (domain_idx = 0; domain_idx < nb_domains; domain_idx++) { @@ -497,12 +492,12 @@ void print_session_stats(const char *session_name) if (!handle) { ERR("Failed to create session handle while printing session statistics."); + ret = -1; goto end; } count = lttng_list_channels(handle, &channels); for (channel_idx = 0; channel_idx < count; channel_idx++) { - int ret; uint64_t discarded_events = 0, lost_packets = 0; struct lttng_channel *channel = &channels[channel_idx]; @@ -525,19 +520,44 @@ void print_session_stats(const char *session_name) } lttng_destroy_handle(handle); } - if (discarded_events_total > 0 && !selected_session->snapshot_mode) { - MSG("[warning] %" PRIu64 " events discarded, please refer to " + + print_discarded_events = discarded_events_total > 0 && + !selected_session->snapshot_mode; + print_lost_packets = lost_packets_total > 0 && + !selected_session->snapshot_mode; + + if (print_discarded_events && print_lost_packets) { + ret = asprintf(&stats_str, + "Warning: %" PRIu64 + " events were discarded and %" PRIu64 + " packets were lost, please refer to " + "the documentation on channel configuration.", + discarded_events_total, lost_packets_total); + } else if (print_discarded_events) { + ret = asprintf(&stats_str, + "Warning: %" PRIu64 + " events were discarded, please refer to " "the documentation on channel configuration.", discarded_events_total); - } - if (lost_packets_total > 0 && !selected_session->snapshot_mode) { - MSG("[warning] %" PRIu64 " packets lost, please refer to " + } else if (print_lost_packets) { + ret = asprintf(&stats_str, + "Warning: %" PRIu64 + " packets were lost, please refer to " "the documentation on channel configuration.", lost_packets_total); + } else { + ret = 0; } + if (ret < 0) { + ERR("Failed to format lost packet and discarded events statistics"); + } else { + *out_str = stats_str; + ret = 0; + } end: free(sessions); + return ret; } int show_cmd_help(const char *cmd_name, const char *help_msg)