return msg;
}
-struct ctf_msg_iter *ctf_msg_iter_create(struct ctf_trace_class *tc, size_t max_request_sz,
- struct ctf_msg_iter_medium_ops medops, void *data,
- bt_self_message_iterator *self_msg_iter,
- const bt2c::Logger& parentLogger)
+ctf_msg_iter_up ctf_msg_iter_create(struct ctf_trace_class *tc, size_t max_request_sz,
+ struct ctf_msg_iter_medium_ops medops, void *data,
+ bt_self_message_iterator *self_msg_iter,
+ const bt2c::Logger& parentLogger)
{
struct bt_bfcr_cbs cbs = {
.classes =
"data={}, log-level={}",
fmt::ptr(tc), max_request_sz, fmt::ptr(data), logger.level());
- ctf_msg_iter *msg_it = new ctf_msg_iter {std::move(logger)};
+ ctf_msg_iter_up msg_it {new ctf_msg_iter {std::move(logger)}};
msg_it->self_msg_iter = self_msg_iter;
msg_it->meta.tc = tc;
msg_it->medium.medops = medops;
msg_it->medium.max_request_sz = max_request_sz;
msg_it->medium.data = data;
- msg_it->stack = stack_new(msg_it);
+ msg_it->stack = stack_new(msg_it.get());
msg_it->stored_values = g_array_new(FALSE, TRUE, sizeof(uint64_t));
g_array_set_size(msg_it->stored_values, tc->stored_value_count);
goto error;
}
- msg_it->bfcr = bt_bfcr_create(cbs, msg_it, msg_it->logger);
+ msg_it->bfcr = bt_bfcr_create(cbs, msg_it.get(), msg_it->logger);
if (!msg_it->bfcr) {
BT_CPPLOGE_APPEND_CAUSE_SPEC(msg_it->logger,
"Failed to create binary class reader (BFCR).");
goto error;
}
- ctf_msg_iter_reset(msg_it);
+ ctf_msg_iter_reset(msg_it.get());
BT_CPPLOGD_SPEC(msg_it->logger,
"Created CTF plugin message iterator: "
"trace-addr={}, max-request-size={}, "
return msg_it;
error:
- ctf_msg_iter_destroy(msg_it);
- msg_it = NULL;
+ msg_it.reset();
goto end;
}
delete msg_it;
}
+void ctf_msg_iter_deleter::operator()(ctf_msg_iter *iter) noexcept
+{
+ ctf_msg_iter_destroy(iter);
+}
+
enum ctf_msg_iter_status ctf_msg_iter_get_next_message(struct ctf_msg_iter *msg_it,
const bt_message **message)
{
bt_stream *(*borrow_stream)(bt_stream_class *stream_class, int64_t stream_id, void *data);
};
+/** CTF message iterator. */
+struct ctf_msg_iter;
+
+struct ctf_msg_iter_deleter
+{
+ void operator()(ctf_msg_iter *iter) noexcept;
+};
+
+using ctf_msg_iter_up = std::unique_ptr<ctf_msg_iter, ctf_msg_iter_deleter>;
+
/**
* Creates a CTF message iterator.
*
* @returns New CTF message iterator on
* success, or \c NULL on error
*/
-struct ctf_msg_iter *ctf_msg_iter_create(struct ctf_trace_class *tc, size_t max_request_sz,
- struct ctf_msg_iter_medium_ops medops, void *medops_data,
- bt_self_message_iterator *self_msg_iter,
- const bt2c::Logger& logger);
+ctf_msg_iter_up ctf_msg_iter_create(struct ctf_trace_class *tc, size_t max_request_sz,
+ struct ctf_msg_iter_medium_ops medops, void *medops_data,
+ bt_self_message_iterator *self_msg_iter,
+ const bt2c::Logger& logger);
/**
* Destroys a CTF message iterator, freeing all internal resources.
goto error;
}
- msg_iter_data->msg_iter = ctf_msg_iter_create(
- msg_iter_data->ds_file_group->ctf_fs_trace->metadata->tc,
- bt_common_get_page_size(static_cast<int>(msg_iter_data->logger.level())) * 8,
- ctf_fs_ds_group_medops, msg_iter_data->msg_iter_medops_data.get(), self_msg_iter,
- msg_iter_data->logger);
+ msg_iter_data->msg_iter =
+ ctf_msg_iter_create(
+ msg_iter_data->ds_file_group->ctf_fs_trace->metadata->tc,
+ bt_common_get_page_size(static_cast<int>(msg_iter_data->logger.level())) * 8,
+ ctf_fs_ds_group_medops, msg_iter_data->msg_iter_medops_data.get(), self_msg_iter,
+ msg_iter_data->logger)
+ .release();
if (!msg_iter_data->msg_iter) {
BT_CPPLOGE_APPEND_CAUSE_SPEC(msg_iter_data->logger,
"Cannot create a CTF message iterator.");
/* Create a temporary iterator to read the ds_file. */
msg_iter = ctf_msg_iter_create(
- ctf_fs_trace->metadata->tc,
- bt_common_get_page_size(static_cast<int>(ctf_fs_trace->logger.level())) * 8,
- ctf_fs_ds_file_medops, ds_file.get(), nullptr, ctf_fs_trace->logger);
+ ctf_fs_trace->metadata->tc,
+ bt_common_get_page_size(static_cast<int>(ctf_fs_trace->logger.level())) * 8,
+ ctf_fs_ds_file_medops, ds_file.get(), nullptr, ctf_fs_trace->logger)
+ .release();
if (!msg_iter) {
BT_CPPLOGE_STR_SPEC(ctf_fs_trace->logger, "Cannot create a CTF message iterator.");
goto error;
BT_ASSERT(ctf_fs_trace->metadata->tc);
msg_iter = ctf_msg_iter_create(
- ctf_fs_trace->metadata->tc,
- bt_common_get_page_size(static_cast<int>(ctf_fs_trace->logger.level())) * 8,
- ctf_fs_ds_file_medops, ds_file.get(), NULL, ctf_fs_trace->logger);
+ ctf_fs_trace->metadata->tc,
+ bt_common_get_page_size(static_cast<int>(ctf_fs_trace->logger.level())) * 8,
+ ctf_fs_ds_file_medops, ds_file.get(), NULL, ctf_fs_trace->logger)
+ .release();
if (!msg_iter) {
/* ctf_msg_iter_create() logs errors. */
ret = -1;
fmt::ptr(self_msg_iter));
stream_iter->msg_iter =
ctf_msg_iter_create(ctf_tc, lttng_live->max_query_size, medops, stream_iter,
- self_msg_iter, stream_iter->logger);
+ self_msg_iter, stream_iter->logger)
+ .release();
if (!stream_iter->msg_iter) {
BT_CPPLOGE_APPEND_CAUSE_SPEC(stream_iter->logger,
"Failed to create CTF message iterator");
struct ctf_trace_class *ctf_tc =
ctf_metadata_decoder_borrow_ctf_trace_class(trace->metadata->decoder.get());
BT_ASSERT(!stream_iter->msg_iter);
- stream_iter->msg_iter =
- ctf_msg_iter_create(ctf_tc, lttng_live->max_query_size, medops, stream_iter,
- self_msg_iter, stream_iter->logger);
+ stream_iter->msg_iter = ctf_msg_iter_create(ctf_tc, lttng_live->max_query_size, medops,
+ stream_iter, self_msg_iter, stream_iter->logger)
+ .release();
if (!stream_iter->msg_iter) {
BT_CPPLOGE_APPEND_CAUSE_SPEC(stream_iter->logger,
"Failed to create CTF message iterator");