X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Ffield.hpp;h=2e3a67bf42f23f39a2b4242a1817096daff92778;hb=b6bbb1d666531bf061f29884da1b0d7c10f59aa0;hp=93091572885413e4722bff08358fc7dd13ba1dc8;hpb=45110cdd99bd9ecc13a12d29afde3fffa48b4641;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/field.hpp b/src/bin/lttng-sessiond/field.hpp index 930915728..2e3a67bf4 100644 --- a/src/bin/lttng-sessiond/field.hpp +++ b/src/bin/lttng-sessiond/field.hpp @@ -9,6 +9,7 @@ #define LTTNG_FIELD_H #include +#include #include @@ -65,6 +66,10 @@ public: bool operator==(const type& other) const noexcept; bool operator!=(const type& other) const noexcept; virtual ~type(); + + /* Obtain an independent copy of `type`. */ + virtual type::cuptr copy() const = 0; + virtual void accept(type_visitor& visitor) const = 0; const unsigned int alignment; @@ -133,6 +138,8 @@ public: base base, roles roles = {}); + virtual type::cuptr copy() const override; + virtual void accept(type_visitor& visitor) const override; const enum byte_order byte_order; @@ -157,6 +164,8 @@ public: unsigned int exponent_digits, unsigned int mantissa_digits); + virtual type::cuptr copy() const override final; + virtual void accept(type_visitor& visitor) const override final; const enum byte_order byte_order; @@ -211,8 +220,7 @@ public: { } - /* Mapping with an implicit value. */ - enumeration_mapping(std::string in_name) : name{std::move(in_name)} + enumeration_mapping(std::string in_name, MappingIntegerType value) : name{std::move(in_name)}, range{value, value} { } @@ -221,7 +229,12 @@ public: } const std::string name; - const nonstd::optional range; + /* + * Only one range per mapping is supported for the moment as + * the tracers (and CTF 1.8) can't express multiple ranges per + * mapping, which is allowed by CTF 2. + */ + const range_t range; }; template @@ -232,7 +245,7 @@ bool operator==(const enumeration_mapping& lhs, } } /* namespace details */ -template +template class typed_enumeration_type : public enumeration_type { public: using mapping = details::enumeration_mapping; @@ -256,13 +269,19 @@ public: integer_type::signedness::UNSIGNED, in_base, std::move(in_roles)), - _mappings{std::move(in_mappings)} + mappings_{std::move(in_mappings)} + { + } + + virtual type::cuptr copy() const override { + return lttng::make_unique>( + alignment, byte_order, size, base_, mappings_, roles_); } virtual void accept(type_visitor& visitor) const override final; - const std::shared_ptr _mappings; + const std::shared_ptr mappings_; private: virtual bool _is_equal(const type& base_other) const noexcept override final @@ -270,7 +289,7 @@ private: const auto& other = static_cast&>( base_other); - return integer_type::_is_equal(base_other) && *this->_mappings == *other._mappings; + return integer_type::_is_equal(base_other) && *this->mappings_ == *other.mappings_; } }; @@ -294,6 +313,8 @@ public: type::cuptr element_type, uint64_t in_length); + virtual type::cuptr copy() const override final; + virtual void accept(type_visitor& visitor) const override final; const uint64_t length; @@ -308,6 +329,8 @@ public: type::cuptr element_type, field_location length_field_location); + virtual type::cuptr copy() const override final; + virtual void accept(type_visitor& visitor) const override final; const field_location length_field_location; @@ -320,13 +343,15 @@ class static_length_blob_type : public type { public: enum class role { /* Packet header field class specific role. */ - TRACE_CLASS_UUID, + METADATA_STREAM_UUID, }; using roles = std::vector; static_length_blob_type(unsigned int alignment, uint64_t in_length_bytes, roles roles = {}); + virtual type::cuptr copy() const override final; + virtual void accept(type_visitor& visitor) const override final; const uint64_t length_bytes; @@ -340,6 +365,8 @@ class dynamic_length_blob_type : public type { public: dynamic_length_blob_type(unsigned int alignment, field_location length_field_location); + virtual type::cuptr copy() const override final; + virtual void accept(type_visitor& visitor) const override final; const field_location length_field_location; @@ -372,6 +399,9 @@ class static_length_string_type : public string_type { public: static_length_string_type( unsigned int alignment, enum encoding in_encoding, uint64_t length); + + virtual type::cuptr copy() const override final; + virtual void accept(type_visitor& visitor) const override final; const uint64_t length; @@ -385,6 +415,9 @@ public: dynamic_length_string_type(unsigned int alignment, enum encoding in_encoding, field_location length_field_location); + + virtual type::cuptr copy() const override final; + virtual void accept(type_visitor& visitor) const override final; const field_location length_field_location; @@ -396,6 +429,9 @@ private: class null_terminated_string_type : public string_type { public: null_terminated_string_type(unsigned int alignment, enum encoding in_encoding); + + virtual type::cuptr copy() const override final; + virtual void accept(type_visitor& visitor) const override final; }; @@ -405,15 +441,17 @@ public: structure_type(unsigned int alignment, fields in_fields); + virtual type::cuptr copy() const override final; + virtual void accept(type_visitor& visitor) const override final; - const fields _fields; + const fields fields_; private: virtual bool _is_equal(const type& base_other) const noexcept override final; }; -template +template class variant_type : public type { static_assert(std::is_samecopy()); + } + + return lttng::make_unique>( + alignment, selector_field_location, std::move(copy_of_choices)); } virtual void accept(type_visitor& visitor) const override final; const field_location selector_field_location; - const choices _choices; + const choices choices_; private: static bool _choices_are_equal(const choices& a, const choices& b) @@ -462,7 +514,7 @@ private: const auto& other = static_cast(base_other); return selector_field_location == other.selector_field_location && - _choices_are_equal(_choices, other._choices); + _choices_are_equal(choices_, other.choices_); } }; @@ -502,6 +554,8 @@ protected: } /* namespace lttng */ /* + * Field formatters for libfmt. + * * Due to a bug in g++ < 7.1, this specialization must be enclosed in the fmt namespace, * see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56480. */ @@ -543,6 +597,52 @@ struct formatter : formatter +::std::string format_mapping_range(typename lttng::sessiond::trace::typed_enumeration_type< + MappingIntegerType>::mapping::range_t range) +{ + if (range.begin == range.end) { + return ::fmt::format("[{}]", range.begin); + } else { + return ::fmt::format("[{}, {}]", range.begin, range.end); + } +} +} /* namespace details */ + +template <> +struct formatter + : formatter { + template + typename FormatCtx::iterator + format(typename lttng::sessiond::trace::signed_enumeration_type::mapping::range_t range, + FormatCtx& ctx) + { + return format_to(ctx.out(), + details::format_mapping_range< + lttng::sessiond::trace::signed_enumeration_type:: + mapping::range_t::range_integer_t>( + range)); + } +}; + +template <> +struct formatter + : formatter { + template + typename FormatCtx::iterator + format(typename lttng::sessiond::trace::unsigned_enumeration_type::mapping::range_t range, + FormatCtx& ctx) + { + return format_to(ctx.out(), + details::format_mapping_range< + lttng::sessiond::trace::unsigned_enumeration_type:: + mapping::range_t::range_integer_t>( + range)); + } +}; + } /* namespace fmt */ #endif /* LTTNG_FIELD_H */