summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
d512607)
To allow further clean-ups and simplify the use of STL containers, wrap
the manually managed mi_writer instance.
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: I8a0b21f0647460333bae1c0a2afeb5d2193a2c9b
#define _LGPL_SOURCE
#include <common/compat/getenv.hpp>
#include <common/compat/string.hpp>
#define _LGPL_SOURCE
#include <common/compat/getenv.hpp>
#include <common/compat/string.hpp>
+#include <common/make-unique-wrapper.hpp>
#include <common/sessiond-comm/sessiond-comm.hpp>
#include <common/string-utils/string-utils.hpp>
#include <common/utils.hpp>
#include <common/sessiond-comm/sessiond-comm.hpp>
#include <common/string-utils/string-utils.hpp>
#include <common/utils.hpp>
+void _mi_lttng_writer_deleter_func(mi_writer *writer)
+{
+ if (writer && mi_lttng_writer_destroy(writer)) {
+ LTTNG_THROW_ERROR("Failed to destroy mi_writer instance");
+ }
+}
+
+using mi_writer_uptr = std::unique_ptr<
+ mi_writer,
+ lttng::memory::create_deleter_class<mi_writer, _mi_lttng_writer_deleter_func>::deleter>;
int opt_event_type;
const char *opt_loglevel;
int opt_event_type;
const char *opt_loglevel;
char *opt_filter;
char *opt_exclude;
char *opt_filter;
char *opt_exclude;
+struct lttng_handle *handle;
+mi_writer_uptr writer;
+
#ifdef LTTNG_EMBED_HELP
static const char help_msg[] =
#include <lttng-enable-event.1.h>
#ifdef LTTNG_EMBED_HELP
static const char help_msg[] =
#include <lttng-enable-event.1.h>
-struct lttng_handle *handle;
-struct mi_writer *writer;
-
struct poptOption long_options[] = {
/* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
{ "help", 'h', POPT_ARG_NONE, nullptr, OPT_HELP, nullptr, nullptr },
struct poptOption long_options[] = {
/* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
{ "help", 'h', POPT_ARG_NONE, nullptr, OPT_HELP, nullptr, nullptr },
- ret = mi_lttng_writer_open_element(writer, config_element_exclusions);
+ ret = mi_lttng_writer_open_element(writer.get(), config_element_exclusions);
(const char *) lttng_dynamic_pointer_array_get_pointer(exclusions, i);
ret = mi_lttng_writer_write_element_string(
(const char *) lttng_dynamic_pointer_array_get_pointer(exclusions, i);
ret = mi_lttng_writer_write_element_string(
- writer, config_element_exclusion, exclusion);
+ writer.get(), config_element_exclusion, exclusion);
if (ret) {
goto end;
}
}
/* Close exclusions element */
if (ret) {
goto end;
}
}
/* Close exclusions element */
- ret = mi_lttng_writer_close_element(writer);
+ ret = mi_lttng_writer_close_element(writer.get());
/* Prepare Mi */
if (lttng_opt_mi) {
/* Open a events element */
/* Prepare Mi */
if (lttng_opt_mi) {
/* Open a events element */
- ret = mi_lttng_writer_open_element(writer, config_element_events);
+ ret = mi_lttng_writer_open_element(writer.get(), config_element_events);
if (ret) {
ret = CMD_ERROR;
goto error;
if (ret) {
ret = CMD_ERROR;
goto error;
ev->enabled = 0;
success = 0;
}
ev->enabled = 0;
success = 0;
}
- ret = mi_lttng_event(writer, ev, 1, handle->domain.type);
+ ret = mi_lttng_event(writer.get(), ev, 1, handle->domain.type);
if (ret) {
ret = CMD_ERROR;
goto error;
if (ret) {
ret = CMD_ERROR;
goto error;
/* Success ? */
ret = mi_lttng_writer_write_element_bool(
/* Success ? */
ret = mi_lttng_writer_write_element_bool(
- writer, mi_lttng_element_command_success, success);
+ writer.get(), mi_lttng_element_command_success, success);
if (ret) {
ret = CMD_ERROR;
goto error;
}
/* Close event element */
if (ret) {
ret = CMD_ERROR;
goto error;
}
/* Close event element */
- ret = mi_lttng_writer_close_element(writer);
+ ret = mi_lttng_writer_close_element(writer.get());
if (ret) {
ret = CMD_ERROR;
goto error;
if (ret) {
ret = CMD_ERROR;
goto error;
- ret = mi_lttng_event(writer, ev, 1, handle->domain.type);
+ ret = mi_lttng_event(writer.get(), ev, 1, handle->domain.type);
if (ret) {
ret = CMD_ERROR;
goto error;
if (ret) {
ret = CMD_ERROR;
goto error;
/* Success ? */
ret = mi_lttng_writer_write_element_bool(
/* Success ? */
ret = mi_lttng_writer_write_element_bool(
- writer, mi_lttng_element_command_success, success);
+ writer.get(), mi_lttng_element_command_success, success);
if (ret) {
ret = CMD_ERROR;
goto end;
}
/* Close event element */
if (ret) {
ret = CMD_ERROR;
goto end;
}
/* Close event element */
- ret = mi_lttng_writer_close_element(writer);
+ ret = mi_lttng_writer_close_element(writer.get());
if (ret) {
ret = CMD_ERROR;
goto end;
if (ret) {
ret = CMD_ERROR;
goto end;
/* Close Mi */
if (lttng_opt_mi) {
/* Close events element */
/* Close Mi */
if (lttng_opt_mi) {
/* Close events element */
- ret = mi_lttng_writer_close_element(writer);
+ ret = mi_lttng_writer_close_element(writer.get());
if (ret) {
ret = CMD_ERROR;
goto error;
if (ret) {
ret = CMD_ERROR;
goto error;
/* Mi check */
if (lttng_opt_mi) {
/* Mi check */
if (lttng_opt_mi) {
- writer = mi_lttng_writer_create(fileno(stdout), lttng_opt_mi);
+ writer = mi_writer_uptr(mi_lttng_writer_create(fileno(stdout), lttng_opt_mi));
if (!writer) {
ret = -LTTNG_ERR_NOMEM;
goto end;
}
/* Open command element */
if (!writer) {
ret = -LTTNG_ERR_NOMEM;
goto end;
}
/* Open command element */
- ret = mi_lttng_writer_command_open(writer, mi_lttng_element_command_enable_event);
+ ret = mi_lttng_writer_command_open(writer.get(),
+ mi_lttng_element_command_enable_event);
if (ret) {
ret = CMD_ERROR;
goto end;
}
/* Open output element */
if (ret) {
ret = CMD_ERROR;
goto end;
}
/* Open output element */
- ret = mi_lttng_writer_open_element(writer, mi_lttng_element_command_output);
+ ret = mi_lttng_writer_open_element(writer.get(), mi_lttng_element_command_output);
if (ret) {
ret = CMD_ERROR;
goto end;
if (ret) {
ret = CMD_ERROR;
goto end;
/* Mi closing */
if (lttng_opt_mi) {
/* Close output element */
/* Mi closing */
if (lttng_opt_mi) {
/* Close output element */
- ret = mi_lttng_writer_close_element(writer);
+ ret = mi_lttng_writer_close_element(writer.get());
if (ret) {
ret = CMD_ERROR;
goto end;
}
ret = mi_lttng_writer_write_element_bool(
if (ret) {
ret = CMD_ERROR;
goto end;
}
ret = mi_lttng_writer_write_element_bool(
- writer, mi_lttng_element_command_success, success);
+ writer.get(), mi_lttng_element_command_success, success);
if (ret) {
ret = CMD_ERROR;
goto end;
}
/* Command element close */
if (ret) {
ret = CMD_ERROR;
goto end;
}
/* Command element close */
- ret = mi_lttng_writer_command_close(writer);
+ ret = mi_lttng_writer_command_close(writer.get());
if (ret) {
ret = CMD_ERROR;
goto end;
if (ret) {
ret = CMD_ERROR;
goto end;
- /* Mi clean-up */
- if (writer && mi_lttng_writer_destroy(writer)) {
- /* Preserve original error code */
- ret = ret ? ret : LTTNG_ERR_MI_IO_FAIL;
- }
-
if (opt_session_name == nullptr) {
free(session_name);
}
if (opt_session_name == nullptr) {
free(session_name);
}
while (cmd->name != nullptr) {
/* Find command */
if (strcmp(argv[0], cmd->name) == 0) {
while (cmd->name != nullptr) {
/* Find command */
if (strcmp(argv[0], cmd->name) == 0) {
- ret = cmd->func(argc, (const char **) argv);
+ try {
+ ret = cmd->func(argc, (const char **) argv);
+ } catch (const std::exception& e) {
+ ERR_FMT("{}", e.what());
+ ret = CMD_ERROR;
+ }
+