X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fplugins%2Fctf%2Flttng-live%2Flttng-live.hpp;h=9dbc432abf3f527abc3ef64017b474aab2ddbc3d;hb=9d0b798a513f4e3b177c15ea381040f4fe6011b9;hp=d963e987b628fb5ad50968d36005d5a28a8b017c;hpb=e18a6ca2cd80b5983cedb63054b2c5c0fe5e4478;p=babeltrace.git diff --git a/src/plugins/ctf/lttng-live/lttng-live.hpp b/src/plugins/ctf/lttng-live/lttng-live.hpp index d963e987..9dbc432a 100644 --- a/src/plugins/ctf/lttng-live/lttng-live.hpp +++ b/src/plugins/ctf/lttng-live/lttng-live.hpp @@ -16,15 +16,37 @@ #include -#include "common/macros.h" +#include "cpp-common/bt2/message.hpp" +#include "cpp-common/vendor/fmt/format.h" /* IWYU pragma: keep */ -#include "../common/metadata/decoder.hpp" -#include "../common/msg-iter/msg-iter.hpp" +#include "../common/src/metadata/tsdl/decoder.hpp" +#include "../common/src/msg-iter/msg-iter.hpp" #include "viewer-connection.hpp" -struct lttng_live_component; -struct lttng_live_session; -struct lttng_live_msg_iter; +/* + * bt_common_lttng_live_url_parts is defined in common code, and is also used + * by C code, so it can't be C++-ified yet. Use this separate deleter object + * in the mean time. + */ +struct bt_common_lttng_live_url_parts_deleter +{ + explicit bt_common_lttng_live_url_parts_deleter(bt_common_lttng_live_url_parts& obj) noexcept : + _mObj {&obj} + { + } + + bt_common_lttng_live_url_parts_deleter(const bt_common_lttng_live_url_parts_deleter&) = delete; + bt_common_lttng_live_url_parts& + operator=(const bt_common_lttng_live_url_parts_deleter&) = delete; + + ~bt_common_lttng_live_url_parts_deleter() + { + bt_common_destroy_lttng_live_url_parts(_mObj); + } + +private: + bt_common_lttng_live_url_parts *_mObj; +}; enum lttng_live_stream_state { @@ -46,38 +68,67 @@ enum lttng_live_stream_state LTTNG_LIVE_STREAM_EOF, }; +inline const char *format_as(const lttng_live_stream_state state) noexcept +{ + switch (state) { + case LTTNG_LIVE_STREAM_ACTIVE_NO_DATA: + return "ACTIVE_NO_DATA"; + + case LTTNG_LIVE_STREAM_QUIESCENT_NO_DATA: + return "QUIESCENT_NO_DATA"; + + case LTTNG_LIVE_STREAM_QUIESCENT: + return "QUIESCENT"; + + case LTTNG_LIVE_STREAM_ACTIVE_DATA: + return "ACTIVE_DATA"; + + case LTTNG_LIVE_STREAM_EOF: + return "EOF"; + } + + bt_common_abort(); +} + /* Iterator over a live stream. */ struct lttng_live_stream_iterator { - bt_logging_level log_level; - bt_self_component *self_comp; + using UP = std::unique_ptr; + + explicit lttng_live_stream_iterator(const bt2c::Logger& parentLogger) : + logger {parentLogger, "PLUGIN/SRC.CTF.LTTNG-LIVE/STREAM-ITER"} + { + } - /* Owned by this. */ - bt_stream *stream; + ~lttng_live_stream_iterator(); + + bt2c::Logger logger; + + bt2::Stream::Shared stream; /* Weak reference. */ - struct lttng_live_trace *trace; + struct lttng_live_trace *trace = nullptr; /* * Since only a single iterator per viewer connection, we have * only a single message iterator per stream. */ - struct ctf_msg_iter *msg_iter; + ctf_msg_iter_up msg_iter; - uint64_t viewer_stream_id; + uint64_t viewer_stream_id = 0; struct { - bool is_set; - uint64_t value; + bool is_set = false; + uint64_t value = 0; } ctf_stream_class_id; /* base offset in current index. */ - uint64_t base_offset; + uint64_t base_offset = 0; /* len to read in current index. */ - uint64_t len; + uint64_t len = 0; /* offset in current index. */ - uint64_t offset; + uint64_t offset = 0; /* * Clock Snapshot value of the last message iterator inactivity message @@ -85,45 +136,46 @@ struct lttng_live_stream_iterator */ struct { - bool is_set; - uint64_t value; + bool is_set = false; + uint64_t value = 0; } last_inactivity_ts; /* * Clock Snapshot value of the current message iterator inactivity * message we might want to send downstream. */ - uint64_t current_inactivity_ts; + uint64_t current_inactivity_ts = 0; - enum lttng_live_stream_state state; + enum lttng_live_stream_state state = LTTNG_LIVE_STREAM_QUIESCENT; - /* - * The current message produced by this live stream iterator. Owned by - * this. - */ - const bt_message *current_msg; + /* The current message produced by this live stream iterator. */ + bt2::ConstMessage::Shared current_msg; /* Timestamp in nanoseconds of the current message (current_msg). */ - int64_t current_msg_ts_ns; + int64_t current_msg_ts_ns = 0; - /* Owned by this. */ - uint8_t *buf; - size_t buflen; + std::vector buf; - /* Owned by this. */ - GString *name; + std::string name; - bool has_stream_hung_up; + bool has_stream_hung_up = false; }; struct lttng_live_metadata { - bt_logging_level log_level; - bt_self_component *self_comp; + using UP = std::unique_ptr; + + explicit lttng_live_metadata(const bt2c::Logger& parentLogger) : + logger {parentLogger, "PLUGIN/SRC.CTF.LTTNG-LIVE/METADATA"} + { + } + + bt2c::Logger logger; + + uint64_t stream_id = 0; - uint64_t stream_id; /* Weak reference. */ - struct ctf_metadata_decoder *decoder; + ctf_metadata_decoder_up decoder; }; enum lttng_live_metadata_stream_state @@ -150,55 +202,65 @@ enum lttng_live_metadata_stream_state struct lttng_live_trace { - bt_logging_level log_level; - bt_self_component *self_comp; + using UP = std::unique_ptr; + + explicit lttng_live_trace(const bt2c::Logger& parentLogger) : + logger {parentLogger, "PLUGIN/SRC.CTF.LTTNG-LIVE/TRACE"} + { + } + + bt2c::Logger logger; /* Back reference to session. */ - struct lttng_live_session *session; + struct lttng_live_session *session = nullptr; /* ctf trace ID within the session. */ - uint64_t id; + uint64_t id = 0; - /* Owned by this. */ - bt_trace *trace; + bt2::Trace::Shared trace; - /* Weak reference. */ - bt_trace_class *trace_class; + bt2::TraceClass::Shared trace_class; - struct lttng_live_metadata *metadata; + lttng_live_metadata::UP metadata; - const bt_clock_class *clock_class; + const bt_clock_class *clock_class = nullptr; - /* Array of pointers to struct lttng_live_stream_iterator. */ - /* Owned by this. */ - GPtrArray *stream_iterators; + std::vector stream_iterators; - enum lttng_live_metadata_stream_state metadata_stream_state; + enum lttng_live_metadata_stream_state metadata_stream_state = + LTTNG_LIVE_METADATA_STREAM_STATE_NEEDED; }; struct lttng_live_session { - bt_logging_level log_level; - bt_self_component *self_comp; + using UP = std::unique_ptr; + + explicit lttng_live_session(const bt2c::Logger& parentLogger) : + logger {parentLogger, "PLUGIN/SRC.CTF.LTTNG-LIVE/SESSION"} + { + } + + ~lttng_live_session(); + + bt2c::Logger logger; + + bt_self_component *self_comp = nullptr; /* Weak reference. */ - struct lttng_live_msg_iter *lttng_live_msg_iter; + struct lttng_live_msg_iter *lttng_live_msg_iter = nullptr; - /* Owned by this. */ - GString *hostname; + std::string hostname; - /* Owned by this. */ - GString *session_name; + std::string session_name; - uint64_t id; + uint64_t id = 0; - /* Array of pointers to struct lttng_live_trace. */ - GPtrArray *traces; + std::vector traces; - bool attached; - bool new_streams_needed; - bool lazy_stream_msg_init; - bool closed; + bool attached = false; + bool new_streams_needed = false; + bool lazy_stream_msg_init = false; + bool closed = false; }; enum session_not_found_action @@ -213,51 +275,66 @@ enum session_not_found_action */ struct lttng_live_component { - bt_logging_level log_level; + using UP = std::unique_ptr; + + explicit lttng_live_component(bt2c::Logger loggerParam) noexcept : + logger {std::move(loggerParam)} + { + } + + bt2c::Logger logger; /* Weak reference. */ - bt_self_component *self_comp; + bt_self_component *self_comp = nullptr; struct { - GString *url; - enum session_not_found_action sess_not_found_act; + std::string url; + enum session_not_found_action sess_not_found_act = SESSION_NOT_FOUND_ACTION_CONTINUE; } params; - size_t max_query_size; + size_t max_query_size = 0; /* * Keeps track of whether the downstream component already has a * message iterator on this component. */ - bool has_msg_iter; + bool has_msg_iter = false; }; struct lttng_live_msg_iter { - bt_logging_level log_level; - bt_self_component *self_comp; + using UP = std::unique_ptr; + + explicit lttng_live_msg_iter(const bt2c::Logger& parentLogger) : + logger {parentLogger, "PLUGIN/SRC.CTF.LTTNG-LIVE/MSG-ITER"} + { + } + + ~lttng_live_msg_iter(); + + bt2c::Logger logger; + + bt_self_component *self_comp = nullptr; /* Weak reference. */ - struct lttng_live_component *lttng_live_comp; + struct lttng_live_component *lttng_live_comp = nullptr; /* Weak reference. */ - bt_self_message_iterator *self_msg_iter; + bt_self_message_iterator *self_msg_iter = nullptr; - /* Owned by this. */ - struct live_viewer_connection *viewer_connection; + live_viewer_connection::UP viewer_connection; - /* Array of pointers to struct lttng_live_session. */ - GPtrArray *sessions; + std::vector sessions; /* Number of live stream iterator this message iterator has.*/ - uint64_t active_stream_iter; + uint64_t active_stream_iter = 0; /* Timestamp in nanosecond of the last message sent downstream. */ - int64_t last_msg_ts_ns; + int64_t last_msg_ts_ns = 0; /* True if the iterator was interrupted. */ - bool was_interrupted; + bool was_interrupted = false; }; enum lttng_live_iterator_status @@ -280,6 +357,37 @@ enum lttng_live_iterator_status LTTNG_LIVE_ITERATOR_STATUS_UNSUPPORTED = -4, }; +inline const char *format_as(const lttng_live_iterator_status status) noexcept +{ + switch (status) { + case LTTNG_LIVE_ITERATOR_STATUS_CONTINUE: + return "LTTNG_LIVE_ITERATOR_STATUS_CONTINUE"; + + case LTTNG_LIVE_ITERATOR_STATUS_AGAIN: + return "LTTNG_LIVE_ITERATOR_STATUS_AGAIN"; + + case LTTNG_LIVE_ITERATOR_STATUS_END: + return "LTTNG_LIVE_ITERATOR_STATUS_END"; + + case LTTNG_LIVE_ITERATOR_STATUS_OK: + return "LTTNG_LIVE_ITERATOR_STATUS_OK"; + + case LTTNG_LIVE_ITERATOR_STATUS_INVAL: + return "LTTNG_LIVE_ITERATOR_STATUS_INVAL"; + + case LTTNG_LIVE_ITERATOR_STATUS_ERROR: + return "LTTNG_LIVE_ITERATOR_STATUS_ERROR"; + + case LTTNG_LIVE_ITERATOR_STATUS_NOMEM: + return "LTTNG_LIVE_ITERATOR_STATUS_NOMEM"; + + case LTTNG_LIVE_ITERATOR_STATUS_UNSUPPORTED: + return "LTTNG_LIVE_ITERATOR_STATUS_UNSUPPORTED"; + } + + bt_common_abort(); +} + bt_component_class_initialize_method_status lttng_live_component_init(bt_self_component_source *self_comp, bt_self_component_source_configuration *config, const bt_value *params, @@ -327,7 +435,7 @@ int lttng_live_add_session(struct lttng_live_msg_iter *lttng_live_msg_iter, uint * written to the file. */ enum lttng_live_get_one_metadata_status -lttng_live_get_one_metadata_packet(struct lttng_live_trace *trace, FILE *fp, size_t *reply_len); +lttng_live_get_one_metadata_packet(struct lttng_live_trace *trace, std::vector& buf); enum lttng_live_iterator_status lttng_live_get_next_index(struct lttng_live_msg_iter *lttng_live_msg_iter,