X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fmi-lttng.c;h=ef98687d868108ef6e37e604b9c5e6c577f1cf00;hp=7d5e9c6f91374743f0b6a85b8206645f9c4fb2de;hb=7b4aa11d71edf81f1e5a81a447b4e6b788551594;hpb=e4d484a59932224af0be4ee7b7b23a383163493d diff --git a/src/common/mi-lttng.c b/src/common/mi-lttng.c index 7d5e9c6f9..ef98687d8 100644 --- a/src/common/mi-lttng.c +++ b/src/common/mi-lttng.c @@ -16,54 +16,52 @@ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - -#include -#include +#define _LGPL_SOURCE +#include +#include #include "mi-lttng.h" #include /* Strings related to command */ const char * const mi_lttng_element_command = "command"; -const char * const mi_lttng_element_command_name = "name"; -const char * const mi_lttng_element_command_version = "version"; +const char * const mi_lttng_element_command_action = "snapshot_action"; +const char * const mi_lttng_element_command_add_context = "add-context"; +const char * const mi_lttng_element_command_calibrate = "calibrate"; +const char * const mi_lttng_element_command_create = "create"; +const char * const mi_lttng_element_command_destroy = "destroy"; +const char * const mi_lttng_element_command_disable_channel = "disable-channel"; +const char * const mi_lttng_element_command_disable_event = "disable-event"; +const char * const mi_lttng_element_command_enable_channels = "enable-channel"; const char * const mi_lttng_element_command_enable_event = "enable-event"; const char * const mi_lttng_element_command_list = "list"; -const char * const mi_lttng_element_command_save = "save"; const char * const mi_lttng_element_command_load = "load"; +const char * const mi_lttng_element_command_name = "name"; +const char * const mi_lttng_element_command_output = "output"; +const char * const mi_lttng_element_command_save = "save"; +const char * const mi_lttng_element_command_set_session = "set-session"; +const char * const mi_lttng_element_command_snapshot = "snapshot"; +const char * const mi_lttng_element_command_snapshot_add = "add_snapshot"; +const char * const mi_lttng_element_command_snapshot_del = "del_snapshot"; +const char * const mi_lttng_element_command_snapshot_list = "list_snapshot"; +const char * const mi_lttng_element_command_snapshot_record = "record_snapshot"; const char * const mi_lttng_element_command_start = "start"; const char * const mi_lttng_element_command_stop = "stop"; -const char * const mi_lttng_element_command_create = "create"; -const char * const mi_lttng_element_command_destroy = "destroy"; -const char * const mi_lttng_element_command_calibrate = "calibrate"; -const char * const mi_lttng_element_command_add_context = "add-context"; -const char * const mi_lttng_element_command_enable_channels = "enable-channel"; -const char * const mi_lttng_element_command_set_session = "set-session"; -const char * const mi_lttng_element_command_disable_event = "disable-event"; -const char * const mi_lttng_element_command_output = "output"; const char * const mi_lttng_element_command_success = "success"; +const char * const mi_lttng_element_command_track = "track"; +const char * const mi_lttng_element_command_untrack = "untrack"; +const char * const mi_lttng_element_command_version = "version"; /* Strings related to version command */ const char * const mi_lttng_element_version = "version"; -const char * const mi_lttng_element_version_str = "string"; -const char * const mi_lttng_element_version_web = "url"; -const char * const mi_lttng_element_version_major = "major"; -const char * const mi_lttng_element_version_minor = "minor"; const char * const mi_lttng_element_version_commit = "commit"; +const char * const mi_lttng_element_version_description = "description"; const char * const mi_lttng_element_version_license = "license"; +const char * const mi_lttng_element_version_major = "major"; +const char * const mi_lttng_element_version_minor = "minor"; const char * const mi_lttng_element_version_patch_level = "patchLevel"; -const char * const mi_lttng_element_version_description = "description"; - -/* Strings related to pid */ -const char * const mi_lttng_element_pids = "pids"; -const char * const mi_lttng_element_pid = "pid"; -const char * const mi_lttng_element_pid_id = "id"; - -/* Strings related to save command */ -const char * const mi_lttng_element_save = "save"; - -/* Strings related to load command */ -const char * const mi_lttng_element_load = "load"; +const char * const mi_lttng_element_version_str = "string"; +const char * const mi_lttng_element_version_web = "url"; /* String related to a lttng_event_field */ const char * const mi_lttng_element_event_field = "event_field"; @@ -77,14 +75,25 @@ const char * const mi_lttng_context_type_perf_thread_counter = "PERF_THREAD_COUN /* String related to lttng_event_perf_counter_ctx */ const char * const mi_lttng_element_perf_counter_context = "perf_counter_context"; +/* Strings related to pid */ +const char * const mi_lttng_element_pid_id = "id"; + +/* Strings related to save command */ +const char * const mi_lttng_element_save = "save"; + +/* Strings related to load command */ +const char * const mi_lttng_element_load = "load"; + /* General elements of mi_lttng */ -const char * const mi_lttng_element_type_other = "OTHER"; -const char * const mi_lttng_element_type_integer = "INTEGER"; +const char * const mi_lttng_element_empty = ""; +const char * const mi_lttng_element_id = "id"; +const char * const mi_lttng_element_nowrite = "nowrite"; +const char * const mi_lttng_element_success = "success"; const char * const mi_lttng_element_type_enum = "ENUM"; const char * const mi_lttng_element_type_float = "FLOAT"; +const char * const mi_lttng_element_type_integer = "INTEGER"; +const char * const mi_lttng_element_type_other = "OTHER"; const char * const mi_lttng_element_type_string = "STRING"; -const char * const mi_lttng_element_nowrite = "nowrite"; -const char * const mi_lttng_element_success = "success"; /* String related to loglevel */ const char * const mi_lttng_loglevel_str_alert = "TRACE_ALERT"; @@ -104,6 +113,35 @@ const char * const mi_lttng_loglevel_str_notice = "TRACE_NOTICE"; const char * const mi_lttng_loglevel_str_unknown = "UNKNOWN"; const char * const mi_lttng_loglevel_str_warning = "TRACE_WARNING"; +/* String related to loglevel JUL */ +const char * const mi_lttng_loglevel_str_jul_all = "JUL_ALL"; +const char * const mi_lttng_loglevel_str_jul_config = "JUL_CONFIG"; +const char * const mi_lttng_loglevel_str_jul_fine = "JUL_FINE"; +const char * const mi_lttng_loglevel_str_jul_finer = "JUL_FINER"; +const char * const mi_lttng_loglevel_str_jul_finest = "JUL_FINEST"; +const char * const mi_lttng_loglevel_str_jul_info = "JUL_INFO"; +const char * const mi_lttng_loglevel_str_jul_off = "JUL_OFF"; +const char * const mi_lttng_loglevel_str_jul_severe = "JUL_SEVERE"; +const char * const mi_lttng_loglevel_str_jul_warning = "JUL_WARNING"; + +/* String related to loglevel LOG4J */ +const char * const mi_lttng_loglevel_str_log4j_off = "LOG4J_OFF"; +const char * const mi_lttng_loglevel_str_log4j_fatal = "LOG4J_FATAL"; +const char * const mi_lttng_loglevel_str_log4j_error = "LOG4J_ERROR"; +const char * const mi_lttng_loglevel_str_log4j_warn = "LOG4J_WARN"; +const char * const mi_lttng_loglevel_str_log4j_info = "LOG4J_INFO"; +const char * const mi_lttng_loglevel_str_log4j_debug = "LOG4J_DEBUG"; +const char * const mi_lttng_loglevel_str_log4j_trace = "LOG4J_TRACE"; +const char * const mi_lttng_loglevel_str_log4j_all = "LOG4J_ALL"; + +/* String related to loglevel Python */ +const char * const mi_lttng_loglevel_str_python_critical = "PYTHON_CRITICAL"; +const char * const mi_lttng_loglevel_str_python_error = "PYTHON_ERROR"; +const char * const mi_lttng_loglevel_str_python_warning = "PYTHON_WARNING"; +const char * const mi_lttng_loglevel_str_python_info = "PYTHON_INFO"; +const char * const mi_lttng_loglevel_str_python_debug = "PYTHON_DEBUG"; +const char * const mi_lttng_loglevel_str_python_notset = "PYTHON_NOTSET"; + /* String related to loglevel type */ const char * const mi_lttng_loglevel_type_all = "ALL"; const char * const mi_lttng_loglevel_type_range = "RANGE"; @@ -114,48 +152,140 @@ const char * const mi_lttng_loglevel_type_unknown = "UNKNOWN"; const char * const mi_lttng_element_calibrate = "calibrate"; const char * const mi_lttng_element_calibrate_function = "FUNCTION"; -const char * const mi_lttng_element_empty = ""; +/* String related to a lttng_snapshot_output */ +const char * const mi_lttng_element_snapshot_ctrl_url = "ctrl_url"; +const char * const mi_lttng_element_snapshot_data_url = "data_url"; +const char * const mi_lttng_element_snapshot_max_size = "max_size"; +const char * const mi_lttng_element_snapshot_n_ptr = "n_ptr"; +const char * const mi_lttng_element_snapshot_session_name = "session_name"; +const char * const mi_lttng_element_snapshots = "snapshots"; + +/* String related to track/untrack command */ +const char * const mi_lttng_element_track_untrack_all_wildcard = "*"; + -const char *mi_lttng_loglevel_string(int value) +/* This is a merge of jul loglevel and regular loglevel + * Those should never overlap by definition + * (see struct lttng_event loglevel) + */ +LTTNG_HIDDEN +const char *mi_lttng_loglevel_string(int value, enum lttng_domain_type domain) { - switch (value) { - case -1: - return mi_lttng_element_empty; - case LTTNG_LOGLEVEL_EMERG: - return mi_lttng_loglevel_str_emerg; - case LTTNG_LOGLEVEL_ALERT: - return mi_lttng_loglevel_str_alert; - case LTTNG_LOGLEVEL_CRIT: - return mi_lttng_loglevel_str_crit; - case LTTNG_LOGLEVEL_ERR: - return mi_lttng_loglevel_str_err; - case LTTNG_LOGLEVEL_WARNING: - return mi_lttng_loglevel_str_warning; - case LTTNG_LOGLEVEL_NOTICE: - return mi_lttng_loglevel_str_notice; - case LTTNG_LOGLEVEL_INFO: - return mi_lttng_loglevel_str_info; - case LTTNG_LOGLEVEL_DEBUG_SYSTEM: - return mi_lttng_loglevel_str_debug_system; - case LTTNG_LOGLEVEL_DEBUG_PROGRAM: - return mi_lttng_loglevel_str_debug_program; - case LTTNG_LOGLEVEL_DEBUG_PROCESS: - return mi_lttng_loglevel_str_debug_process; - case LTTNG_LOGLEVEL_DEBUG_MODULE: - return mi_lttng_loglevel_str_debug_module; - case LTTNG_LOGLEVEL_DEBUG_UNIT: - return mi_lttng_loglevel_str_debug_unit; - case LTTNG_LOGLEVEL_DEBUG_FUNCTION: - return mi_lttng_loglevel_str_debug_function; - case LTTNG_LOGLEVEL_DEBUG_LINE: - return mi_lttng_loglevel_str_debug_line; - case LTTNG_LOGLEVEL_DEBUG: - return mi_lttng_loglevel_str_debug; - default: - return mi_lttng_loglevel_str_unknown; + switch (domain) { + case LTTNG_DOMAIN_KERNEL: + case LTTNG_DOMAIN_UST: + switch (value) { + case -1: + return mi_lttng_element_empty; + case LTTNG_LOGLEVEL_EMERG: + return mi_lttng_loglevel_str_emerg; + case LTTNG_LOGLEVEL_ALERT: + return mi_lttng_loglevel_str_alert; + case LTTNG_LOGLEVEL_CRIT: + return mi_lttng_loglevel_str_crit; + case LTTNG_LOGLEVEL_ERR: + return mi_lttng_loglevel_str_err; + case LTTNG_LOGLEVEL_WARNING: + return mi_lttng_loglevel_str_warning; + case LTTNG_LOGLEVEL_NOTICE: + return mi_lttng_loglevel_str_notice; + case LTTNG_LOGLEVEL_INFO: + return mi_lttng_loglevel_str_info; + case LTTNG_LOGLEVEL_DEBUG_SYSTEM: + return mi_lttng_loglevel_str_debug_system; + case LTTNG_LOGLEVEL_DEBUG_PROGRAM: + return mi_lttng_loglevel_str_debug_program; + case LTTNG_LOGLEVEL_DEBUG_PROCESS: + return mi_lttng_loglevel_str_debug_process; + case LTTNG_LOGLEVEL_DEBUG_MODULE: + return mi_lttng_loglevel_str_debug_module; + case LTTNG_LOGLEVEL_DEBUG_UNIT: + return mi_lttng_loglevel_str_debug_unit; + case LTTNG_LOGLEVEL_DEBUG_FUNCTION: + return mi_lttng_loglevel_str_debug_function; + case LTTNG_LOGLEVEL_DEBUG_LINE: + return mi_lttng_loglevel_str_debug_line; + case LTTNG_LOGLEVEL_DEBUG: + return mi_lttng_loglevel_str_debug; + default: + return mi_lttng_loglevel_str_unknown; + } + break; + case LTTNG_DOMAIN_LOG4J: + switch (value) { + case -1: + return mi_lttng_element_empty; + case LTTNG_LOGLEVEL_LOG4J_OFF: + return mi_lttng_loglevel_str_log4j_off; + case LTTNG_LOGLEVEL_LOG4J_FATAL: + return mi_lttng_loglevel_str_log4j_fatal; + case LTTNG_LOGLEVEL_LOG4J_ERROR: + return mi_lttng_loglevel_str_log4j_error; + case LTTNG_LOGLEVEL_LOG4J_WARN: + return mi_lttng_loglevel_str_log4j_warn; + case LTTNG_LOGLEVEL_LOG4J_INFO: + return mi_lttng_loglevel_str_log4j_info; + case LTTNG_LOGLEVEL_LOG4J_DEBUG: + return mi_lttng_loglevel_str_log4j_debug; + case LTTNG_LOGLEVEL_LOG4J_TRACE: + return mi_lttng_loglevel_str_log4j_trace; + case LTTNG_LOGLEVEL_LOG4J_ALL: + return mi_lttng_loglevel_str_log4j_all; + default: + return mi_lttng_loglevel_str_unknown; + } + break; + case LTTNG_DOMAIN_JUL: + switch (value) { + case -1: + return mi_lttng_element_empty; + case LTTNG_LOGLEVEL_JUL_OFF: + return mi_lttng_loglevel_str_jul_off; + case LTTNG_LOGLEVEL_JUL_SEVERE: + return mi_lttng_loglevel_str_jul_severe; + case LTTNG_LOGLEVEL_JUL_WARNING: + return mi_lttng_loglevel_str_jul_warning; + case LTTNG_LOGLEVEL_JUL_INFO: + return mi_lttng_loglevel_str_jul_info; + case LTTNG_LOGLEVEL_JUL_CONFIG: + return mi_lttng_loglevel_str_jul_config; + case LTTNG_LOGLEVEL_JUL_FINE: + return mi_lttng_loglevel_str_jul_fine; + case LTTNG_LOGLEVEL_JUL_FINER: + return mi_lttng_loglevel_str_jul_finer; + case LTTNG_LOGLEVEL_JUL_FINEST: + return mi_lttng_loglevel_str_jul_finest; + case LTTNG_LOGLEVEL_JUL_ALL: + return mi_lttng_loglevel_str_jul_all; + default: + return mi_lttng_loglevel_str_unknown; + } + break; + case LTTNG_DOMAIN_PYTHON: + switch (value) { + case LTTNG_LOGLEVEL_PYTHON_CRITICAL: + return mi_lttng_loglevel_str_python_critical; + case LTTNG_LOGLEVEL_PYTHON_ERROR: + return mi_lttng_loglevel_str_python_error; + case LTTNG_LOGLEVEL_PYTHON_WARNING: + return mi_lttng_loglevel_str_python_warning; + case LTTNG_LOGLEVEL_PYTHON_INFO: + return mi_lttng_loglevel_str_python_info; + case LTTNG_LOGLEVEL_PYTHON_DEBUG: + return mi_lttng_loglevel_str_python_debug; + case LTTNG_LOGLEVEL_PYTHON_NOTSET: + return mi_lttng_loglevel_str_python_notset; + default: + return mi_lttng_loglevel_str_unknown; + } + break; } + + /* Reaching this means the domain is unknown. */ + return mi_lttng_loglevel_str_unknown; } +LTTNG_HIDDEN const char *mi_lttng_logleveltype_string(enum lttng_loglevel_type value) { switch (value) { @@ -170,6 +300,7 @@ const char *mi_lttng_logleveltype_string(enum lttng_loglevel_type value) } } +LTTNG_HIDDEN const char *mi_lttng_eventtype_string(enum lttng_event_type value) { switch (value) { @@ -192,6 +323,7 @@ const char *mi_lttng_eventtype_string(enum lttng_event_type value) } } +LTTNG_HIDDEN const char *mi_lttng_event_contexttype_string(enum lttng_event_context_type val) { switch (val) { @@ -230,6 +362,7 @@ const char *mi_lttng_event_contexttype_string(enum lttng_event_context_type val) } } +LTTNG_HIDDEN const char *mi_lttng_eventfieldtype_string(enum lttng_event_field_type val) { switch (val) { @@ -246,6 +379,7 @@ const char *mi_lttng_eventfieldtype_string(enum lttng_event_field_type val) } } +LTTNG_HIDDEN const char *mi_lttng_domaintype_string(enum lttng_domain_type value) { /* Note: This is a *duplicate* of get_domain_str from bin/lttng/utils.c */ @@ -256,12 +390,18 @@ const char *mi_lttng_domaintype_string(enum lttng_domain_type value) return config_domain_type_ust; case LTTNG_DOMAIN_JUL: return config_domain_type_jul; + case LTTNG_DOMAIN_LOG4J: + return config_domain_type_log4j; + case LTTNG_DOMAIN_PYTHON: + return config_domain_type_python; default: /* Should not have an unknown domain */ assert(0); + return NULL; } } +LTTNG_HIDDEN const char *mi_lttng_buffertype_string(enum lttng_buffer_type value) { switch (value) { @@ -274,9 +414,11 @@ const char *mi_lttng_buffertype_string(enum lttng_buffer_type value) default: /* Should not have an unknow buffer type */ assert(0); + return NULL; } } +LTTNG_HIDDEN const char *mi_lttng_calibratetype_string(enum lttng_calibrate_type val) { const char *ret; @@ -303,7 +445,7 @@ struct mi_writer *mi_lttng_writer_create(int fd_output, int mi_output_type) goto end; } if (mi_output_type == LTTNG_MI_XML) { - mi_writer->writer = config_writer_create(fd_output); + mi_writer->writer = config_writer_create(fd_output, 0); if (!mi_writer->writer) { goto err_destroy; } @@ -440,7 +582,7 @@ int mi_lttng_version(struct mi_writer *writer, struct mi_lttng_version *version, /* Version string (contain info like rc etc.) */ ret = mi_lttng_writer_write_element_string(writer, - mi_lttng_element_version_str, VERSION); + mi_lttng_element_version_str, version->version); if (ret) { goto end; } @@ -612,7 +754,11 @@ int mi_lttng_domain(struct mi_writer *writer, goto end; } - /* TODO: attr... not sure how to use the union.... */ + /* TODO: union attr + * This union is not currently used and was added for + * future ust domain support. + * Date: 25-06-2014 + * */ if (!is_open) { /* Closing domain element */ @@ -776,6 +922,7 @@ int mi_lttng_event_common_attributes(struct mi_writer *writer, struct lttng_event *event) { int ret; + const char *filter_expression; /* Open event element */ ret = mi_lttng_writer_open_element(writer, config_element_event); @@ -783,48 +930,67 @@ int mi_lttng_event_common_attributes(struct mi_writer *writer, goto end; } - /* event name */ + /* Event name */ ret = mi_lttng_writer_write_element_string(writer, config_element_name, event->name); if (ret) { goto end; } - /* event type */ + /* Event type */ ret = mi_lttng_writer_write_element_string(writer, config_element_type, mi_lttng_eventtype_string(event->type)); if (ret) { goto end; } - /* is event enabled */ + /* Is event enabled */ ret = mi_lttng_writer_write_element_bool(writer, config_element_enabled, event->enabled); if (ret) { goto end; } - /* event filter enabled? */ + /* Event filter enabled? */ ret = mi_lttng_writer_write_element_bool(writer, config_element_filter, event->filter); + /* Event filter expression */ + ret = lttng_event_get_filter_string(event, &filter_expression); + + if (ret) { + goto end; + } + + if (filter_expression) { + ret = mi_lttng_writer_write_element_string(writer, + config_element_filter_expression, + filter_expression); + + if (ret) { + goto end; + } + } + end: return ret; } LTTNG_HIDDEN int mi_lttng_event_tracepoint_loglevel(struct mi_writer *writer, - struct lttng_event *event) + struct lttng_event *event, enum lttng_domain_type domain) { int ret; - /* event loglevel */ + /* Event loglevel */ ret = mi_lttng_writer_write_element_string(writer, - config_element_loglevel, mi_lttng_loglevel_string(event->loglevel)); + config_element_loglevel, + mi_lttng_loglevel_string(event->loglevel, domain)); if (ret) { goto end; } + /* Log level type */ ret = mi_lttng_writer_write_element_string(writer, config_element_loglevel_type, mi_lttng_logleveltype_string(event->loglevel_type)); @@ -858,6 +1024,16 @@ int mi_lttng_event_function_probe(struct mi_writer *writer, { int ret; + ret = mi_lttng_writer_open_element(writer, config_element_attributes); + if (ret) { + goto end; + } + + ret = mi_lttng_writer_open_element(writer, config_element_probe_attributes); + if (ret) { + goto end; + } + if (event->attr.probe.addr != 0) { /* event probe address */ ret = mi_lttng_writer_write_element_unsigned_int(writer, @@ -880,6 +1056,9 @@ int mi_lttng_event_function_probe(struct mi_writer *writer, goto end; } } + + /* Close probe_attributes and attributes */ + ret = mi_lttng_close_multi_element(writer, 2); end: return ret; } @@ -888,9 +1067,29 @@ LTTNG_HIDDEN int mi_lttng_event_function_entry(struct mi_writer *writer, struct lttng_event *event) { + int ret; + + ret = mi_lttng_writer_open_element(writer, config_element_attributes); + if (ret) { + goto end; + } + + ret = mi_lttng_writer_open_element(writer, config_element_probe_attributes); + if (ret) { + goto end; + } + /* event probe symbol_name */ - return mi_lttng_writer_write_element_string(writer, + ret = mi_lttng_writer_write_element_string(writer, config_element_symbol_name, event->attr.ftrace.symbol_name); + if (ret) { + goto end; + } + + /* Close function_attributes and attributes */ + ret = mi_lttng_close_multi_element(writer, 2); +end: + return ret; } LTTNG_HIDDEN @@ -901,7 +1100,7 @@ int mi_lttng_events_open(struct mi_writer *writer) LTTNG_HIDDEN int mi_lttng_event(struct mi_writer *writer, - struct lttng_event *event, int is_open) + struct lttng_event *event, int is_open, enum lttng_domain_type domain) { int ret; @@ -914,12 +1113,14 @@ int mi_lttng_event(struct mi_writer *writer, case LTTNG_EVENT_TRACEPOINT: { if (event->loglevel != -1) { - ret = mi_lttng_event_tracepoint_loglevel(writer, event); + ret = mi_lttng_event_tracepoint_loglevel(writer, event, domain); } else { ret = mi_lttng_event_tracepoint_no_loglevel(writer, event); } break; } + case LTTNG_EVENT_FUNCTION: + /* Fallthrough */ case LTTNG_EVENT_PROBE: ret = mi_lttng_event_function_probe(writer, event); break; @@ -940,20 +1141,47 @@ end: return ret; } +LTTNG_HIDDEN +int mi_lttng_trackers_open(struct mi_writer *writer) +{ + return mi_lttng_writer_open_element(writer, config_element_trackers); +} + +LTTNG_HIDDEN +int mi_lttng_pid_tracker_open(struct mi_writer *writer) +{ + int ret; + + /* Open element pid_tracker */ + ret = mi_lttng_writer_open_element(writer, config_element_pid_tracker); + if (ret) { + goto end; + } + + /* Open targets element */ + ret = mi_lttng_targets_open(writer); +end: + return ret; +} + LTTNG_HIDDEN int mi_lttng_pids_open(struct mi_writer *writer) { - return mi_lttng_writer_open_element(writer, mi_lttng_element_pids); + return mi_lttng_writer_open_element(writer, config_element_pids); } +/* + * TODO: move the listing of pid for user agent to process semantic on + * mi api bump. The use of process element break the mi api. + */ LTTNG_HIDDEN -int mi_lttng_pid(struct mi_writer *writer, pid_t pid , const char *cmdline, +int mi_lttng_pid(struct mi_writer *writer, pid_t pid , const char *name, int is_open) { int ret; - /* Open element pid */ - ret = mi_lttng_writer_open_element(writer, mi_lttng_element_pid); + /* Open pid process */ + ret = mi_lttng_writer_open_element(writer, config_element_pid); if (ret) { goto end; } @@ -966,15 +1194,62 @@ int mi_lttng_pid(struct mi_writer *writer, pid_t pid , const char *cmdline, } /* Writing name of the process */ - ret = mi_lttng_writer_write_element_string(writer, config_element_name, - cmdline); + if (name) { + ret = mi_lttng_writer_write_element_string(writer, config_element_name, + name); + if (ret) { + goto end; + } + } + + if (!is_open) { + /* Closing Pid */ + ret = mi_lttng_writer_close_element(writer); + } + +end: + return ret; +} + +LTTNG_HIDDEN +int mi_lttng_targets_open(struct mi_writer *writer) +{ + return mi_lttng_writer_open_element(writer, + config_element_targets); +} + +LTTNG_HIDDEN +int mi_lttng_pid_target(struct mi_writer *writer, pid_t pid, int is_open) +{ + int ret; + + ret = mi_lttng_writer_open_element(writer, + config_element_target_pid); + if (ret) { + goto end; + } + + /* Writing pid number + * Special case for element all on track untrack command + * All pid is represented as wildcard * + */ + if ((int) pid == -1) { + ret = mi_lttng_writer_write_element_string(writer, + config_element_pid, + mi_lttng_element_track_untrack_all_wildcard); + } else { + ret = mi_lttng_writer_write_element_signed_int(writer, + config_element_pid, (int) pid); + } if (ret) { goto end; } if (!is_open) { - /* Closing Pid */ ret = mi_lttng_writer_close_element(writer); + if (ret) { + goto end; + } } end: @@ -994,9 +1269,6 @@ int mi_lttng_event_field(struct mi_writer *writer, int ret; if (!field->field_name[0]) { - /* To Review: not sure if legal david ? - * how should this be handle ? - */ ret = 0; goto end; } @@ -1064,6 +1336,7 @@ int mi_lttng_calibrate(struct mi_writer *writer, end: return ret; } + LTTNG_HIDDEN int mi_lttng_context(struct mi_writer *writer, struct lttng_event_context *context, int is_open) @@ -1151,3 +1424,241 @@ int mi_lttng_perf_counter_context(struct mi_writer *writer, end: return ret; } + +LTTNG_HIDDEN +int mi_lttng_snapshot_output_session_name(struct mi_writer *writer, + const char *session_name) +{ + int ret; + + /* Open session element */ + ret = mi_lttng_writer_open_element(writer, config_element_session); + if (ret) { + goto end; + } + + /* Snapshot output list for current session name */ + ret = mi_lttng_writer_write_element_string(writer, config_element_name, + session_name); + if (ret) { + goto end; + } + + /* Open element snapshots (sequence one snapshot) */ + ret = mi_lttng_writer_open_element(writer, mi_lttng_element_snapshots); + if (ret) { + goto end; + } + +end: + return ret; +} + +LTTNG_HIDDEN +int mi_lttng_snapshot_list_output(struct mi_writer *writer, + struct lttng_snapshot_output *output) +{ + int ret; + + /* Open element snapshot output */ + ret = mi_lttng_writer_open_element(writer, + mi_lttng_element_command_snapshot); + if (ret) { + goto end; + } + + /* ID of the snapshot output */ + ret = mi_lttng_writer_write_element_unsigned_int(writer, + mi_lttng_element_id, output->id); + if (ret) { + goto end; + } + + /* Name of the output */ + ret = mi_lttng_writer_write_element_string(writer, config_element_name, + output->name); + if (ret) { + goto end; + } + + /* Destination of the output (ctrl_url)*/ + ret = mi_lttng_writer_write_element_string(writer, + mi_lttng_element_snapshot_ctrl_url, output->ctrl_url); + if (ret) { + goto end; + } + + /* Destination of the output (data_url) */ + ret = mi_lttng_writer_write_element_string(writer, + mi_lttng_element_snapshot_data_url, output->data_url); + if (ret) { + goto end; + } + + /* total size of all stream combined */ + ret = mi_lttng_writer_write_element_unsigned_int(writer, + mi_lttng_element_snapshot_max_size, output->max_size); + if (ret) { + goto end; + } + + /* Close snapshot output element */ + ret = mi_lttng_writer_close_element(writer); + +end: + return ret; +} + +LTTNG_HIDDEN +int mi_lttng_snapshot_del_output(struct mi_writer *writer, int id, + const char *name, const char *current_session_name) +{ + int ret; + + /* Open element del_snapshot */ + ret = mi_lttng_writer_open_element(writer, + mi_lttng_element_command_snapshot); + if (ret) { + goto end; + } + + + if (id != UINT32_MAX) { + /* "Snapshot output "id" successfully deleted + * for "current_session_name" + * ID of the snapshot output + */ + ret = mi_lttng_writer_write_element_unsigned_int(writer, + mi_lttng_element_id, id); + if (ret) { + goto end; + } + } else { + /* "Snapshot output "name" successfully deleted + * for session "current_session_name" + * Name of the output + */ + ret = mi_lttng_writer_write_element_string(writer, config_element_name, + name); + if (ret) { + goto end; + } + } + + /* Snapshot was deleted for session "current_session_name"*/ + ret = mi_lttng_writer_write_element_string(writer, + mi_lttng_element_snapshot_session_name, + current_session_name); + if (ret) { + goto end; + } + + /* Close snapshot element */ + ret = mi_lttng_writer_close_element(writer); + +end: + return ret; +} + +LTTNG_HIDDEN +int mi_lttng_snapshot_add_output(struct mi_writer *writer, + const char *current_session_name, const char *n_ptr, + struct lttng_snapshot_output *output) +{ + int ret; + + /* Open element snapshot */ + ret = mi_lttng_writer_open_element(writer, + mi_lttng_element_command_snapshot); + if (ret) { + goto end; + } + + /* Snapshot output id */ + ret = mi_lttng_writer_write_element_unsigned_int(writer, + mi_lttng_element_id, output->id); + if (ret) { + goto end; + } + + /* Snapshot output names */ + ret = mi_lttng_writer_write_element_string(writer, + config_element_name, n_ptr); + if (ret) { + goto end; + } + + /* Destination of the output (ctrl_url)*/ + ret = mi_lttng_writer_write_element_string(writer, + mi_lttng_element_snapshot_ctrl_url, output->ctrl_url); + if (ret) { + goto end; + } + + /* Snapshot added for session "current_session_name"*/ + ret = mi_lttng_writer_write_element_string(writer, + mi_lttng_element_snapshot_session_name, current_session_name); + if (ret) { + goto end; + } + + /* total size of all stream combined */ + ret = mi_lttng_writer_write_element_unsigned_int(writer, + mi_lttng_element_snapshot_max_size, output->max_size); + if (ret) { + goto end; + } + + /* Close snapshot element */ + ret = mi_lttng_writer_close_element(writer); + +end: + return ret; +} + +LTTNG_HIDDEN +int mi_lttng_snapshot_record(struct mi_writer *writer, + const char *current_session_name, const char *url, + const char *cmdline_ctrl_url, const char *cmdline_data_url) +{ + int ret; + + /* Open element snapshot */ + ret = mi_lttng_writer_open_element(writer, + mi_lttng_element_command_snapshot); + if (ret) { + goto end; + } + + /* + * If a valid an URL was given, serialize it, + * else take the command line data and ctrl urls*/ + if (url) { + /* Destination of the output (ctrl_url)*/ + ret = mi_lttng_writer_write_element_string(writer, + mi_lttng_element_snapshot_ctrl_url, url); + if (ret) { + goto end; + } + } else if (cmdline_ctrl_url) { + /* Destination of the output (ctrl_url)*/ + ret = mi_lttng_writer_write_element_string(writer, + mi_lttng_element_snapshot_ctrl_url, cmdline_ctrl_url); + if (ret) { + goto end; + } + + /* Destination of the output (data_url) */ + ret = mi_lttng_writer_write_element_string(writer, + mi_lttng_element_snapshot_data_url, cmdline_data_url); + if (ret) { + goto end; + } + } + + /* Close record_snapshot element */ + ret = mi_lttng_writer_close_element(writer); + +end: + return ret; +}