X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fplugins%2Fctf%2Flttng-live%2Fmetadata.cpp;h=693042d7bf228be5acae70c22b82f85887c238f6;hb=refs%2Fheads%2Fmaster;hp=eee28c41145cff19ee202743fee19882d35c53e9;hpb=ecd7492f21a492b70569d5ecc1d3a808241b63f0;p=babeltrace.git diff --git a/src/plugins/ctf/lttng-live/metadata.cpp b/src/plugins/ctf/lttng-live/metadata.cpp index eee28c41..693042d7 100644 --- a/src/plugins/ctf/lttng-live/metadata.cpp +++ b/src/plugins/ctf/lttng-live/metadata.cpp @@ -6,22 +6,14 @@ * Copyright 2010-2011 EfficiOS Inc. and Linux Foundation */ -#define BT_COMP_LOG_SELF_COMP self_comp -#define BT_LOG_OUTPUT_LEVEL log_level -#define BT_LOG_TAG "PLUGIN/SRC.CTF.LTTNG-LIVE/META" -#include "logging/comp-logging.h" - -#include -#include -#include -#include -#include #include "compat/memstream.h" -#include +#include "cpp-common/bt2c/libc-up.hpp" +#include "cpp-common/bt2s/make-unique.hpp" +#include "../common/src/metadata/tsdl/ctf-meta-configure-ir-trace.hpp" +#include "../common/src/metadata/tsdl/decoder.hpp" +#include "lttng-live.hpp" #include "metadata.hpp" -#include "../common/metadata/decoder.hpp" -#include "../common/metadata/ctf-meta-configure-ir-trace.hpp" #define TSDL_MAGIC 0x75d11d57 @@ -40,13 +32,11 @@ struct packet_header } __attribute__((__packed__)); static bool stream_classes_all_have_default_clock_class(bt_trace_class *tc, - bt_logging_level log_level, - bt_self_component *self_comp) + const bt2c::Logger& logger) { uint64_t i, sc_count; const bt_clock_class *cc = NULL; const bt_stream_class *sc; - bool ret = true; sc_count = bt_trace_class_get_stream_class_count(tc); for (i = 0; i < sc_count; i++) { @@ -56,17 +46,15 @@ static bool stream_classes_all_have_default_clock_class(bt_trace_class *tc, cc = bt_stream_class_borrow_default_clock_class_const(sc); if (!cc) { - ret = false; - BT_COMP_LOGE_APPEND_CAUSE(self_comp, - "Stream class doesn't have a default clock class: " - "sc-id=%" PRIu64 ", sc-name=\"%s\"", - bt_stream_class_get_id(sc), bt_stream_class_get_name(sc)); - goto end; + BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, + "Stream class doesn't have a default clock class: " + "sc-id={}, sc-name=\"{}\"", + bt_stream_class_get_id(sc), bt_stream_class_get_name(sc)); + return false; } } -end: - return ret; + return true; } /* * Iterate over the stream classes and returns the first clock class @@ -86,30 +74,25 @@ static const bt_clock_class *borrow_any_clock_class(bt_trace_class *tc) cc = bt_stream_class_borrow_default_clock_class_const(sc); if (cc) { - goto end; + return cc; } } -end: - BT_ASSERT_DBG(cc); - return cc; + + bt_common_abort(); } enum lttng_live_iterator_status lttng_live_metadata_update(struct lttng_live_trace *trace) { struct lttng_live_session *session = trace->session; - struct lttng_live_metadata *metadata = trace->metadata; - size_t size, len_read = 0; - char *metadata_buf = NULL; + struct lttng_live_metadata *metadata = trace->metadata.get(); + std::vector metadataBuf; bool keep_receiving; - FILE *fp = NULL; + bt2c::FileUP fp; enum ctf_metadata_decoder_status decoder_status; - enum lttng_live_iterator_status status = LTTNG_LIVE_ITERATOR_STATUS_OK; - bt_logging_level log_level = trace->log_level; - bt_self_component *self_comp = trace->self_comp; enum lttng_live_get_one_metadata_status metadata_status; - BT_COMP_LOGD("Updating metadata for trace: session-id=%" PRIu64 ", trace-id=%" PRIu64, - session->id, trace->id); + BT_CPPLOGD_SPEC(metadata->logger, "Updating metadata for trace: session-id={}, trace-id={}", + session->id, trace->id); /* No metadata stream yet. */ if (!metadata) { @@ -119,40 +102,22 @@ enum lttng_live_iterator_status lttng_live_metadata_update(struct lttng_live_tra * metadata this indicates that we will never receive * any metadata. */ - status = LTTNG_LIVE_ITERATOR_STATUS_END; + return LTTNG_LIVE_ITERATOR_STATUS_END; } else if (session->new_streams_needed) { - status = LTTNG_LIVE_ITERATOR_STATUS_AGAIN; + return LTTNG_LIVE_ITERATOR_STATUS_AGAIN; } else { session->new_streams_needed = true; - status = LTTNG_LIVE_ITERATOR_STATUS_CONTINUE; + return LTTNG_LIVE_ITERATOR_STATUS_CONTINUE; } - goto end; } if (trace->metadata_stream_state != LTTNG_LIVE_METADATA_STREAM_STATE_NEEDED) { - goto end; - } - - /* - * Open a new write only file handle to populate the `metadata_buf` - * memory buffer so we can write in loop in it easily. - */ - fp = bt_open_memstream(&metadata_buf, &size); - if (!fp) { - if (errno == EINTR && lttng_live_graph_is_canceled(session->lttng_live_msg_iter)) { - session->lttng_live_msg_iter->was_interrupted = true; - status = LTTNG_LIVE_ITERATOR_STATUS_AGAIN; - } else { - BT_COMP_LOGE_APPEND_CAUSE_ERRNO(self_comp, "Metadata open_memstream", "."); - status = LTTNG_LIVE_ITERATOR_STATUS_ERROR; - } - goto end; + return LTTNG_LIVE_ITERATOR_STATUS_OK; } keep_receiving = true; /* Grab all available metadata. */ while (keep_receiving) { - size_t reply_len = 0; /* * lttng_live_get_one_metadata_packet() asks the Relay Daemon * for new metadata. If new metadata is received, the function @@ -165,19 +130,20 @@ enum lttng_live_iterator_status lttng_live_metadata_update(struct lttng_live_tra * If we receive an _ERROR status, it means there was a * networking, allocating, or some other unrecoverable error. */ - metadata_status = lttng_live_get_one_metadata_packet(trace, fp, &reply_len); + metadata_status = lttng_live_get_one_metadata_packet(trace, metadataBuf); switch (metadata_status) { case LTTNG_LIVE_GET_ONE_METADATA_STATUS_OK: - len_read += reply_len; break; case LTTNG_LIVE_GET_ONE_METADATA_STATUS_END: keep_receiving = false; break; case LTTNG_LIVE_GET_ONE_METADATA_STATUS_CLOSED: - BT_COMP_LOGD("Metadata stream was closed by the Relay, the trace is no longer active: " - "trace-id=%" PRIu64 ", metadata-stream-id=%" PRIu64, - trace->id, metadata->stream_id); + BT_CPPLOGD_SPEC( + metadata->logger, + "Metadata stream was closed by the Relay, the trace is no longer active: " + "trace-id={}, metadata-stream-id={}", + trace->id, metadata->stream_id); /* * The stream was closed and we received everything * there was to receive for this metadata stream. @@ -188,155 +154,103 @@ enum lttng_live_iterator_status lttng_live_metadata_update(struct lttng_live_tra trace->metadata_stream_state = LTTNG_LIVE_METADATA_STREAM_STATE_CLOSED; break; case LTTNG_LIVE_GET_ONE_METADATA_STATUS_ERROR: - BT_COMP_LOGE_APPEND_CAUSE(self_comp, - "Error getting one trace metadata packet: " - "trace-id=%" PRIu64, - trace->id); - goto error; + BT_CPPLOGE_APPEND_CAUSE_SPEC(metadata->logger, + "Error getting one trace metadata packet: trace-id={}", + trace->id); + return LTTNG_LIVE_ITERATOR_STATUS_ERROR; default: bt_common_abort(); } } - /* The memory buffer `metadata_buf` contains all the metadata. */ - if (bt_close_memstream(&metadata_buf, &size, fp)) { - BT_COMP_LOGW_ERRNO("Metadata bt_close_memstream", "."); - } - - fp = NULL; - - if (len_read == 0) { + if (metadataBuf.empty()) { if (!trace->trace) { - status = LTTNG_LIVE_ITERATOR_STATUS_AGAIN; - goto end; + return LTTNG_LIVE_ITERATOR_STATUS_AGAIN; } - /* The relay sent zero bytes of metdata. */ + /* The relay sent zero bytes of metadata. */ trace->metadata_stream_state = LTTNG_LIVE_METADATA_STREAM_STATE_NOT_NEEDED; - goto end; + return LTTNG_LIVE_ITERATOR_STATUS_OK; } /* * Open a new reading file handle on the `metadata_buf` and pass it to * the metadata decoder. */ - fp = bt_fmemopen(metadata_buf, len_read, "rb"); + fp.reset(bt_fmemopen(metadataBuf.data(), metadataBuf.size(), "rb")); if (!fp) { if (errno == EINTR && lttng_live_graph_is_canceled(session->lttng_live_msg_iter)) { session->lttng_live_msg_iter->was_interrupted = true; - status = LTTNG_LIVE_ITERATOR_STATUS_AGAIN; + return LTTNG_LIVE_ITERATOR_STATUS_AGAIN; } else { - BT_COMP_LOGE_APPEND_CAUSE_ERRNO(self_comp, "Cannot memory-open metadata buffer", "."); - status = LTTNG_LIVE_ITERATOR_STATUS_ERROR; + BT_CPPLOGE_ERRNO_APPEND_CAUSE_SPEC(metadata->logger, + "Cannot memory-open metadata buffer", "."); + return LTTNG_LIVE_ITERATOR_STATUS_ERROR; } - goto end; } /* * The call to ctf_metadata_decoder_append_content() will append * new metadata to our current trace class. */ - BT_COMP_LOGD("Appending new metadata to the ctf_trace class"); - decoder_status = ctf_metadata_decoder_append_content(metadata->decoder, fp); + BT_CPPLOGD_SPEC(metadata->logger, "Appending new metadata to the ctf_trace class"); + decoder_status = ctf_metadata_decoder_append_content(metadata->decoder.get(), fp.get()); switch (decoder_status) { case CTF_METADATA_DECODER_STATUS_OK: if (!trace->trace_class) { struct ctf_trace_class *tc = - ctf_metadata_decoder_borrow_ctf_trace_class(metadata->decoder); + ctf_metadata_decoder_borrow_ctf_trace_class(metadata->decoder.get()); - trace->trace_class = ctf_metadata_decoder_get_ir_trace_class(metadata->decoder); - trace->trace = bt_trace_create(trace->trace_class); + trace->trace_class = ctf_metadata_decoder_get_ir_trace_class(metadata->decoder.get()); + trace->trace = trace->trace_class->instantiate(); if (!trace->trace) { - BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Failed to create bt_trace"); - goto error; - } - if (ctf_trace_class_configure_ir_trace(tc, trace->trace)) { - BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Failed to configure ctf trace class"); - goto error; + BT_CPPLOGE_APPEND_CAUSE_SPEC(metadata->logger, "Failed to create bt_trace"); + return LTTNG_LIVE_ITERATOR_STATUS_ERROR; } - if (!stream_classes_all_have_default_clock_class(trace->trace_class, log_level, - self_comp)) { + + ctf_trace_class_configure_ir_trace(tc, *trace->trace); + + if (!stream_classes_all_have_default_clock_class(trace->trace_class->libObjPtr(), + metadata->logger)) { /* Error logged in function. */ - goto error; + return LTTNG_LIVE_ITERATOR_STATUS_ERROR; } - trace->clock_class = borrow_any_clock_class(trace->trace_class); + trace->clock_class = borrow_any_clock_class(trace->trace_class->libObjPtr()); } - /* The metadata was updated succesfully. */ + /* The metadata was updated successfully. */ trace->metadata_stream_state = LTTNG_LIVE_METADATA_STREAM_STATE_NOT_NEEDED; - break; + return LTTNG_LIVE_ITERATOR_STATUS_OK; default: - goto error; + return LTTNG_LIVE_ITERATOR_STATUS_ERROR; } - - goto end; - -error: - status = LTTNG_LIVE_ITERATOR_STATUS_ERROR; -end: - if (fp) { - int closeret; - - closeret = fclose(fp); - if (closeret) { - BT_COMP_LOGW_ERRNO("Error on fclose", "."); - } - } - free(metadata_buf); - return status; } int lttng_live_metadata_create_stream(struct lttng_live_session *session, uint64_t ctf_trace_id, - uint64_t stream_id, const char *) + uint64_t stream_id) { - bt_self_component *self_comp = session->self_comp; - bt_logging_level log_level = session->log_level; - struct lttng_live_metadata *metadata = NULL; struct lttng_live_trace *trace; - ctf_metadata_decoder_config cfg {}; - cfg.log_level = session->log_level; + ctf_metadata_decoder_config cfg {session->logger}; cfg.self_comp = session->self_comp; - cfg.clock_class_offset_s = 0; - cfg.clock_class_offset_ns = 0; cfg.create_trace_class = true; - metadata = g_new0(struct lttng_live_metadata, 1); - if (!metadata) { - return -1; - } - metadata->log_level = session->log_level; - metadata->self_comp = session->self_comp; + auto metadata = bt2s::make_unique(session->logger); metadata->stream_id = stream_id; metadata->decoder = ctf_metadata_decoder_create(&cfg); if (!metadata->decoder) { - BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Failed to create CTF metadata decoder"); - goto error; + BT_CPPLOGE_APPEND_CAUSE_SPEC(session->logger, "Failed to create CTF metadata decoder"); + return -1; } + trace = lttng_live_session_borrow_or_create_trace_by_id(session, ctf_trace_id); if (!trace) { - BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Failed to borrow trace"); - goto error; + BT_CPPLOGE_APPEND_CAUSE_SPEC(session->logger, "Failed to borrow trace"); + return -1; } - trace->metadata = metadata; - return 0; - -error: - ctf_metadata_decoder_destroy(metadata->decoder); - g_free(metadata); - return -1; -} - -void lttng_live_metadata_fini(struct lttng_live_trace *trace) -{ - struct lttng_live_metadata *metadata = trace->metadata; - if (!metadata) { - return; - } - ctf_metadata_decoder_destroy(metadata->decoder); - trace->metadata = NULL; - g_free(metadata); + trace->metadata = std::move(metadata); + return 0; }