static struct lttng_live_trace *
lttng_live_session_borrow_trace_by_id(struct lttng_live_session *session, uint64_t trace_id)
{
- uint64_t trace_idx;
- struct lttng_live_trace *ret_trace = NULL;
-
- for (trace_idx = 0; trace_idx < session->traces->len; trace_idx++) {
- struct lttng_live_trace *trace =
- (lttng_live_trace *) g_ptr_array_index(session->traces, trace_idx);
+ for (lttng_live_trace::UP& trace : session->traces) {
if (trace->id == trace_id) {
- ret_trace = trace;
- goto end;
+ return trace.get();
}
}
-end:
- return ret_trace;
-}
-
-static void lttng_live_destroy_trace(struct lttng_live_trace *trace)
-{
- BT_CPPLOGD_SPEC(trace->logger, "Destroying live trace: trace-id={}", trace->id);
-
- delete trace;
+ return nullptr;
}
static struct lttng_live_trace *lttng_live_create_trace(struct lttng_live_session *session,
BT_CPPLOGD_SPEC(session->logger, "Creating live trace: session-id={}, trace-id={}", session->id,
trace_id);
- lttng_live_trace *trace = new lttng_live_trace {session->logger};
+ auto trace = bt2s::make_unique<lttng_live_trace>(session->logger);
+
trace->session = session;
trace->id = trace_id;
trace->metadata_stream_state = LTTNG_LIVE_METADATA_STREAM_STATE_NEEDED;
- g_ptr_array_add(session->traces, trace);
- return trace;
+ const auto ret = trace.get();
+ session->traces.emplace_back(std::move(trace));
+ return ret;
}
struct lttng_live_trace *
"session-id={}, hostname=\"{}\", session-name=\"{}\"",
session_id, hostname, session_name);
- lttng_live_session *session = new lttng_live_session {lttng_live_msg_iter->logger};
+ auto session = bt2s::make_unique<lttng_live_session>(lttng_live_msg_iter->logger);
+
session->self_comp = lttng_live_msg_iter->self_comp;
session->id = session_id;
- session->traces = g_ptr_array_new_with_free_func((GDestroyNotify) lttng_live_destroy_trace);
- BT_ASSERT(session->traces);
session->lttng_live_msg_iter = lttng_live_msg_iter;
session->new_streams_needed = true;
- session->hostname = g_string_new(hostname);
- BT_ASSERT(session->hostname);
+ session->hostname = hostname;
+ session->session_name = session_name;
- session->session_name = g_string_new(session_name);
- BT_ASSERT(session->session_name);
-
- g_ptr_array_add(lttng_live_msg_iter->sessions, session);
+ lttng_live_msg_iter->sessions.emplace_back(std::move(session));
return 0;
}
-static void lttng_live_destroy_session(struct lttng_live_session *session)
+lttng_live_session::~lttng_live_session()
{
- if (!session) {
- goto end;
- }
+ BT_CPPLOGD_SPEC(this->logger, "Destroying live session: session-id={}, session-name=\"{}\"",
+ this->id, this->session_name);
- BT_CPPLOGD_SPEC(session->logger,
- "Destroying live session: "
- "session-id={}, session-name=\"{}\"",
- session->id, session->session_name->str);
- if (session->id != -1ULL) {
- if (lttng_live_session_detach(session)) {
- if (!lttng_live_graph_is_canceled(session->lttng_live_msg_iter)) {
+ if (this->id != -1ULL) {
+ if (lttng_live_session_detach(this)) {
+ if (!lttng_live_graph_is_canceled(this->lttng_live_msg_iter)) {
/* Old relayd cannot detach sessions. */
- BT_CPPLOGD_SPEC(session->logger, "Unable to detach lttng live session {}",
- session->id);
+ BT_CPPLOGD_SPEC(this->logger, "Unable to detach lttng live session {}", this->id);
}
}
- session->id = -1ULL;
- }
-
- if (session->traces) {
- g_ptr_array_free(session->traces, TRUE);
- }
- if (session->hostname) {
- g_string_free(session->hostname, TRUE);
+ this->id = -1ULL;
}
-
- if (session->session_name) {
- g_string_free(session->session_name, TRUE);
- }
-
- delete session;
-
-end:
- return;
}
-static void lttng_live_msg_iter_destroy(struct lttng_live_msg_iter *lttng_live_msg_iter)
+lttng_live_msg_iter::~lttng_live_msg_iter()
{
- if (!lttng_live_msg_iter) {
- goto end;
- }
-
- if (lttng_live_msg_iter->sessions) {
- g_ptr_array_free(lttng_live_msg_iter->sessions, TRUE);
- }
-
- if (lttng_live_msg_iter->viewer_connection) {
- live_viewer_connection_destroy(lttng_live_msg_iter->viewer_connection);
- }
- BT_ASSERT(lttng_live_msg_iter->lttng_live_comp);
- BT_ASSERT(lttng_live_msg_iter->lttng_live_comp->has_msg_iter);
+ BT_ASSERT(this->lttng_live_comp);
+ BT_ASSERT(this->lttng_live_comp->has_msg_iter);
/* All stream iterators must be destroyed at this point. */
- BT_ASSERT(lttng_live_msg_iter->active_stream_iter == 0);
- lttng_live_msg_iter->lttng_live_comp->has_msg_iter = false;
-
- delete lttng_live_msg_iter;
-
-end:
- return;
+ BT_ASSERT(this->active_stream_iter == 0);
+ this->lttng_live_comp->has_msg_iter = false;
}
void lttng_live_msg_iter_finalize(bt_self_message_iterator *self_msg_iter)
{
- struct lttng_live_msg_iter *lttng_live_msg_iter;
-
- BT_ASSERT(self_msg_iter);
-
- lttng_live_msg_iter =
- (struct lttng_live_msg_iter *) bt_self_message_iterator_get_data(self_msg_iter);
- BT_ASSERT(lttng_live_msg_iter);
- lttng_live_msg_iter_destroy(lttng_live_msg_iter);
+ lttng_live_msg_iter::UP {
+ static_cast<lttng_live_msg_iter *>(bt_self_message_iterator_get_data(self_msg_iter))};
}
static enum lttng_live_iterator_status
struct lttng_live_session *session)
{
enum lttng_live_iterator_status status;
- uint64_t trace_idx;
if (!session->attached) {
BT_CPPLOGD_SPEC(lttng_live_msg_iter->logger, "Attach to session: session-id={}",
}
BT_CPPLOGD_SPEC(lttng_live_msg_iter->logger,
- "Updating all data streams: "
- "session-id={}, session-name=\"{}\"",
- session->id, session->session_name->str);
+ "Updating all data streams: session-id={}, session-name=\"{}\"", session->id,
+ session->session_name);
status = lttng_live_session_get_new_streams(session, lttng_live_msg_iter->self_msg_iter);
switch (status) {
lttng_live_msg_iter->logger,
"Updating streams returned _END status. Override status to _OK in order fetch any remaining metadata:"
"session-id={}, session-name=\"{}\"",
- session->id, session->session_name->str);
+ session->id, session->session_name);
status = LTTNG_LIVE_ITERATOR_STATUS_OK;
break;
default:
}
BT_CPPLOGD_SPEC(lttng_live_msg_iter->logger,
- "Updating metadata stream for session: "
- "session-id={}, session-name=\"{}\"",
- session->id, session->session_name->str);
+ "Updating metadata stream for session: session-id={}, session-name=\"{}\"",
+ session->id, session->session_name);
- trace_idx = 0;
- while (trace_idx < session->traces->len) {
- struct lttng_live_trace *trace =
- (lttng_live_trace *) g_ptr_array_index(session->traces, trace_idx);
-
- status = lttng_live_metadata_update(trace);
+ for (lttng_live_trace::UP& trace : session->traces) {
+ status = lttng_live_metadata_update(trace.get());
switch (status) {
case LTTNG_LIVE_ITERATOR_STATUS_END:
case LTTNG_LIVE_ITERATOR_STATUS_OK:
- trace_idx++;
break;
case LTTNG_LIVE_ITERATOR_STATUS_CONTINUE:
case LTTNG_LIVE_ITERATOR_STATUS_AGAIN:
static void
lttng_live_force_new_streams_and_metadata(struct lttng_live_msg_iter *lttng_live_msg_iter)
{
- uint64_t session_idx, trace_idx;
-
- for (session_idx = 0; session_idx < lttng_live_msg_iter->sessions->len; session_idx++) {
- struct lttng_live_session *session =
- (lttng_live_session *) g_ptr_array_index(lttng_live_msg_iter->sessions, session_idx);
+ for (const auto& session : lttng_live_msg_iter->sessions) {
BT_CPPLOGD_SPEC(lttng_live_msg_iter->logger,
"Force marking session as needing new streams: "
"session-id={}",
session->id);
session->new_streams_needed = true;
- for (trace_idx = 0; trace_idx < session->traces->len; trace_idx++) {
- struct lttng_live_trace *trace =
- (lttng_live_trace *) g_ptr_array_index(session->traces, trace_idx);
+ for (lttng_live_trace::UP& trace : session->traces) {
BT_CPPLOGD_SPEC(lttng_live_msg_iter->logger,
"Force marking trace metadata state as needing an update: "
"session-id={}, trace-id={}",
{
enum lttng_live_iterator_status status;
enum lttng_live_viewer_status viewer_status;
- uint64_t session_idx = 0, nr_sessions_opened = 0;
- struct lttng_live_session *session;
+ uint64_t nr_sessions_opened = 0;
enum session_not_found_action sess_not_found_act =
lttng_live_msg_iter->lttng_live_comp->params.sess_not_found_act;
* need to query for new sessions even though we have sessions
* currently ongoing.
*/
- if (lttng_live_msg_iter->sessions->len == 0) {
+ if (lttng_live_msg_iter->sessions.empty()) {
if (sess_not_found_act != SESSION_NOT_FOUND_ACTION_CONTINUE) {
BT_CPPLOGD_SPEC(
lttng_live_msg_iter->logger,
}
}
- for (session_idx = 0; session_idx < lttng_live_msg_iter->sessions->len; session_idx++) {
- session =
- (lttng_live_session *) g_ptr_array_index(lttng_live_msg_iter->sessions, session_idx);
- status = lttng_live_get_session(lttng_live_msg_iter, session);
+ for (const auto& session : lttng_live_msg_iter->sessions) {
+ status = lttng_live_get_session(lttng_live_msg_iter, session.get());
switch (status) {
case LTTNG_LIVE_ITERATOR_STATUS_OK:
case LTTNG_LIVE_ITERATOR_STATUS_END:
{
enum lttng_live_iterator_status ret = LTTNG_LIVE_ITERATOR_STATUS_OK;
enum ctf_msg_iter_status status;
- uint64_t session_idx, trace_idx;
-
- for (session_idx = 0; session_idx < lttng_live_msg_iter->sessions->len; session_idx++) {
- struct lttng_live_session *session =
- (lttng_live_session *) g_ptr_array_index(lttng_live_msg_iter->sessions, session_idx);
+ for (const auto& session : lttng_live_msg_iter->sessions) {
if (session->new_streams_needed) {
BT_CPPLOGD_SPEC(lttng_live_msg_iter->logger,
"Need an update for streams: "
ret = LTTNG_LIVE_ITERATOR_STATUS_CONTINUE;
goto end;
}
- for (trace_idx = 0; trace_idx < session->traces->len; trace_idx++) {
- struct lttng_live_trace *trace =
- (lttng_live_trace *) g_ptr_array_index(session->traces, trace_idx);
+ for (lttng_live_trace::UP& trace : session->traces) {
if (trace->metadata_stream_state == LTTNG_LIVE_METADATA_STREAM_STATE_NEEDED) {
BT_CPPLOGD_SPEC(lttng_live_msg_iter->logger,
"Need an update for metadata stream: "
goto end;
}
- BT_ASSERT_DBG(session->traces);
-
- while (trace_idx < session->traces->len) {
+ while (trace_idx < session->traces.size()) {
bool trace_is_ended = false;
struct lttng_live_stream_iterator *stream_iter;
- struct lttng_live_trace *trace =
- (lttng_live_trace *) g_ptr_array_index(session->traces, trace_idx);
+ lttng_live_trace *trace = session->traces[trace_idx].get();
stream_iter_status =
next_stream_iterator_for_trace(lttng_live_msg_iter, trace, &stream_iter);
} else {
/*
* trace_idx is not incremented since
- * g_ptr_array_remove_index_fast replaces the
+ * vectorFastRemove replaces the
* element at trace_idx with the array's last element.
*/
- g_ptr_array_remove_index_fast(session->traces, trace_idx);
+ bt2c::vectorFastRemove(session->traces, trace_idx);
}
}
if (youngest_candidate_stream_iter) {
*
* In either cases, we return END.
*/
- BT_ASSERT(session->traces->len == 0);
+ BT_ASSERT(session->traces.empty());
stream_iter_status = LTTNG_LIVE_ITERATOR_STATUS_END;
}
end:
(struct lttng_live_msg_iter *) bt_self_message_iterator_get_data(self_msg_it);
struct lttng_live_component *lttng_live = lttng_live_msg_iter->lttng_live_comp;
enum lttng_live_iterator_status stream_iter_status;
- uint64_t session_idx;
*count = 0;
* the user, session count will be 0. In this case, we return status
* end to return gracefully.
*/
- if (lttng_live_msg_iter->sessions->len == 0) {
+ if (lttng_live_msg_iter->sessions.empty()) {
if (lttng_live->params.sess_not_found_act != SESSION_NOT_FOUND_ACTION_CONTINUE) {
status = BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_END;
goto end;
*candidate_stream_iter = NULL;
int64_t youngest_msg_ts_ns = INT64_MAX;
- BT_ASSERT_DBG(lttng_live_msg_iter->sessions);
- session_idx = 0;
- while (session_idx < lttng_live_msg_iter->sessions->len) {
- struct lttng_live_session *session = (lttng_live_session *) g_ptr_array_index(
- lttng_live_msg_iter->sessions, session_idx);
+ uint64_t session_idx = 0;
+ while (session_idx < lttng_live_msg_iter->sessions.size()) {
+ lttng_live_session *session = lttng_live_msg_iter->sessions[session_idx].get();
/* Find the best candidate message to send downstream. */
stream_iter_status = next_stream_iterator_for_session(lttng_live_msg_iter, session,
* - All live stream iterators have ENDed.
*/
if (stream_iter_status == LTTNG_LIVE_ITERATOR_STATUS_END) {
- if (session->closed && session->traces->len == 0) {
+ if (session->closed && session->traces.empty()) {
/*
* Remove the session from the list.
* session_idx is not modified since
* replaces the the removed element with
* the array's last element.
*/
- g_ptr_array_remove_index_fast(lttng_live_msg_iter->sessions, session_idx);
+ bt2c::vectorFastRemove(lttng_live_msg_iter->sessions, session_idx);
} else {
session_idx++;
}
}
}
-static struct lttng_live_msg_iter *
+static lttng_live_msg_iter::UP
lttng_live_msg_iter_create(struct lttng_live_component *lttng_live_comp,
bt_self_message_iterator *self_msg_it)
{
- lttng_live_msg_iter *msg_iter = new lttng_live_msg_iter {lttng_live_comp->logger};
+ auto msg_iter = bt2s::make_unique<struct lttng_live_msg_iter>(lttng_live_comp->logger);
+
msg_iter->self_comp = lttng_live_comp->self_comp;
msg_iter->lttng_live_comp = lttng_live_comp;
msg_iter->self_msg_iter = self_msg_it;
-
msg_iter->active_stream_iter = 0;
msg_iter->last_msg_ts_ns = INT64_MIN;
msg_iter->was_interrupted = false;
- msg_iter->sessions =
- g_ptr_array_new_with_free_func((GDestroyNotify) lttng_live_destroy_session);
- BT_ASSERT(msg_iter->sessions);
-
return msg_iter;
}
bt_self_message_iterator_configuration *, bt_self_component_port_output *)
{
try {
- bt_message_iterator_class_initialize_method_status status;
struct lttng_live_component *lttng_live;
- struct lttng_live_msg_iter *lttng_live_msg_iter;
enum lttng_live_viewer_status viewer_status;
bt_self_component *self_comp = bt_self_message_iterator_borrow_component(self_msg_it);
BT_ASSERT(!lttng_live->has_msg_iter);
lttng_live->has_msg_iter = true;
- lttng_live_msg_iter = lttng_live_msg_iter_create(lttng_live, self_msg_it);
+ auto lttng_live_msg_iter = lttng_live_msg_iter_create(lttng_live, self_msg_it);
if (!lttng_live_msg_iter) {
BT_CPPLOGE_APPEND_CAUSE_SPEC(lttng_live->logger,
"Failed to create lttng_live_msg_iter");
- status = BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR;
- goto error;
+ return BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR;
}
viewer_status = live_viewer_connection_create(
- lttng_live->params.url.c_str(), false, lttng_live_msg_iter, lttng_live_msg_iter->logger,
- <tng_live_msg_iter->viewer_connection);
+ lttng_live->params.url.c_str(), false, lttng_live_msg_iter.get(),
+ lttng_live_msg_iter->logger, lttng_live_msg_iter->viewer_connection);
if (viewer_status != LTTNG_LIVE_VIEWER_STATUS_OK) {
if (viewer_status == LTTNG_LIVE_VIEWER_STATUS_ERROR) {
BT_CPPLOGE_APPEND_CAUSE_SPEC(lttng_live_msg_iter->logger,
"Interrupted while creating viewer connection");
}
- status = BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_ERROR;
- goto error;
+ return BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_ERROR;
}
- viewer_status = lttng_live_create_viewer_session(lttng_live_msg_iter);
+ viewer_status = lttng_live_create_viewer_session(lttng_live_msg_iter.get());
if (viewer_status != LTTNG_LIVE_VIEWER_STATUS_OK) {
if (viewer_status == LTTNG_LIVE_VIEWER_STATUS_ERROR) {
BT_CPPLOGE_APPEND_CAUSE_SPEC(lttng_live_msg_iter->logger,
"Interrupted when creating viewer session");
}
- status = BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_ERROR;
- goto error;
+ return BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_ERROR;
}
- if (lttng_live_msg_iter->sessions->len == 0) {
+ if (lttng_live_msg_iter->sessions.empty()) {
switch (lttng_live->params.sess_not_found_act) {
case SESSION_NOT_FOUND_ACTION_CONTINUE:
BT_CPPLOGI_SPEC(
"component parameter: url =\"{}\"",
SESS_NOT_FOUND_ACTION_PARAM, SESS_NOT_FOUND_ACTION_FAIL_STR,
lttng_live->params.url);
- status = BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_ERROR;
- goto error;
+ return BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_ERROR;
case SESSION_NOT_FOUND_ACTION_END:
BT_CPPLOGI_SPEC(lttng_live_msg_iter->logger,
"Unable to connect to the requested live viewer session. "
}
}
- bt_self_message_iterator_set_data(self_msg_it, lttng_live_msg_iter);
- status = BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_OK;
- goto end;
-
-error:
- lttng_live_msg_iter_destroy(lttng_live_msg_iter);
-end:
- return status;
+ bt_self_message_iterator_set_data(self_msg_it, lttng_live_msg_iter.release());
+ return BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_OK;
} catch (const std::bad_alloc&) {
return BT_MESSAGE_ITERATOR_CLASS_INITIALIZE_METHOD_STATUS_MEMORY_ERROR;
} catch (const bt2::Error&) {
bt_param_validation_value_descr::makeString()},
BT_PARAM_VALIDATION_MAP_VALUE_ENTRY_END};
-static bt_component_class_query_method_status
-lttng_live_query_list_sessions(const bt_value *params, const bt_value **result,
- const bt2c::Logger& logger)
+static bt2::Value::Shared lttng_live_query_list_sessions(const bt2::ConstMapValue params,
+ const bt2c::Logger& logger)
{
- bt_component_class_query_method_status status;
- const bt_value *url_value = NULL;
const char *url;
- struct live_viewer_connection *viewer_connection = NULL;
+ live_viewer_connection::UP viewer_connection;
enum lttng_live_viewer_status viewer_status;
enum bt_param_validation_status validation_status;
gchar *validate_error = NULL;
- validation_status = bt_param_validation_validate(params, list_sessions_params, &validate_error);
+ validation_status =
+ bt_param_validation_validate(params.libObjPtr(), list_sessions_params, &validate_error);
if (validation_status == BT_PARAM_VALIDATION_STATUS_MEMORY_ERROR) {
- status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR;
- goto error;
+ throw bt2c::MemoryError {};
} else if (validation_status == BT_PARAM_VALIDATION_STATUS_VALIDATION_ERROR) {
- status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
- BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "{}", validate_error);
- goto error;
+ bt2c::GCharUP errorFreer {validate_error};
+
+ BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(logger, bt2::Error, "{}", validate_error);
}
- url_value = bt_value_map_borrow_entry_value_const(params, URL_PARAM);
- url = bt_value_string_get(url_value);
+ url = params[URL_PARAM]->asString().value();
- viewer_status = live_viewer_connection_create(url, true, NULL, logger, &viewer_connection);
+ viewer_status = live_viewer_connection_create(url, true, NULL, logger, viewer_connection);
if (viewer_status != LTTNG_LIVE_VIEWER_STATUS_OK) {
if (viewer_status == LTTNG_LIVE_VIEWER_STATUS_ERROR) {
- BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "Failed to create viewer connection");
- status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
+ BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(logger, bt2::Error,
+ "Failed to create viewer connection");
} else if (viewer_status == LTTNG_LIVE_VIEWER_STATUS_INTERRUPTED) {
- status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_AGAIN;
+ throw bt2c::TryAgain {};
} else {
bt_common_abort();
}
- goto error;
- }
-
- status = live_viewer_connection_list_sessions(viewer_connection, result);
- if (status != BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK) {
- BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "Failed to list viewer sessions");
- goto error;
}
- goto end;
-
-error:
- BT_VALUE_PUT_REF_AND_RESET(*result);
-
- if (status >= 0) {
- status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
- }
-
-end:
- if (viewer_connection) {
- live_viewer_connection_destroy(viewer_connection);
- }
-
- g_free(validate_error);
-
- return status;
+ return live_viewer_connection_list_sessions(viewer_connection.get());
}
-static bt_component_class_query_method_status
-lttng_live_query_support_info(const bt_value *params, const bt_value **result,
- const bt2c::Logger& logger)
+static bt2::Value::Shared lttng_live_query_support_info(const bt2::ConstMapValue params,
+ const bt2c::Logger& logger)
{
- bt_component_class_query_method_status status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK;
- const bt_value *input_type_value;
- const bt_value *input_value;
- double weight = 0;
struct bt_common_lttng_live_url_parts parts = {};
+ bt_common_lttng_live_url_parts_deleter partsDeleter {parts};
/* Used by the logging macros */
__attribute__((unused)) bt_self_component *self_comp = NULL;
- *result = NULL;
- input_type_value = bt_value_map_borrow_entry_value_const(params, "type");
- if (!input_type_value) {
- BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "Missing expected `type` parameter.");
- goto error;
+ const auto typeValue = params["type"];
+ if (!typeValue) {
+ BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(logger, bt2::Error,
+ "Missing expected `type` parameter.");
}
- if (!bt_value_is_string(input_type_value)) {
- BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "`type` parameter is not a string value.");
- goto error;
+ if (!typeValue->isString()) {
+ BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(logger, bt2::Error,
+ "`type` parameter is not a string value.");
}
- if (strcmp(bt_value_string_get(input_type_value), "string") != 0) {
+ if (strcmp(typeValue->asString().value(), "string") != 0) {
/* We don't handle file system paths */
- goto create_result;
+ return bt2::RealValue::create();
}
- input_value = bt_value_map_borrow_entry_value_const(params, "input");
- if (!input_value) {
- BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "Missing expected `input` parameter.");
- goto error;
+ const auto inputValue = params["input"];
+ if (!inputValue) {
+ BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(logger, bt2::Error,
+ "Missing expected `input` parameter.");
}
- if (!bt_value_is_string(input_value)) {
- BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "`input` parameter is not a string value.");
- goto error;
+ if (!inputValue->isString()) {
+ BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(logger, bt2::Error,
+ "`input` parameter is not a string value.");
}
- parts = bt_common_parse_lttng_live_url(bt_value_string_get(input_value), NULL, 0);
+ parts = bt_common_parse_lttng_live_url(inputValue->asString().value(), NULL, 0);
if (parts.session_name) {
/*
* Looks pretty much like an LTTng live URL: we got the
* session name part, which forms a complete URL.
*/
- weight = .75;
+ return bt2::RealValue::create(.75);
}
-create_result:
- *result = bt_value_real_create_init(weight);
- if (!*result) {
- status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR;
- goto error;
- }
-
- goto end;
-
-error:
- if (status >= 0) {
- status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_ERROR;
- }
-
- BT_ASSERT(!*result);
-
-end:
- bt_common_destroy_lttng_live_url_parts(&parts);
- return status;
+ return bt2::RealValue::create();
}
bt_component_class_query_method_status lttng_live_query(bt_self_component_class_source *comp_class,
const bt_value **result)
{
try {
- bt_component_class_query_method_status status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK;
bt2c::Logger logger {bt2::SelfComponentClass {comp_class},
bt2::PrivateQueryExecutor {priv_query_exec},
"PLUGIN/SRC.CTF.LTTNG-LIVE/QUERY"};
+ const bt2::ConstMapValue paramsObj(params);
+ bt2::Value::Shared resultObj;
if (strcmp(object, "sessions") == 0) {
- status = lttng_live_query_list_sessions(params, result, logger);
+ resultObj = lttng_live_query_list_sessions(paramsObj, logger);
} else if (strcmp(object, "babeltrace.support-info") == 0) {
- status = lttng_live_query_support_info(params, result, logger);
+ resultObj = lttng_live_query_support_info(paramsObj, logger);
} else {
BT_CPPLOGI_SPEC(logger, "Unknown query object `{}`", object);
- status = BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_UNKNOWN_OBJECT;
- goto end;
+ return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_UNKNOWN_OBJECT;
}
-end:
- return status;
+ *result = resultObj.release().libObjPtr();
+
+ return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_OK;
+ } catch (const bt2c::TryAgain&) {
+ return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR;
} catch (const std::bad_alloc&) {
return BT_COMPONENT_CLASS_QUERY_METHOD_STATUS_MEMORY_ERROR;
} catch (const bt2::Error&) {