X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Ftsdl-trace-class-visitor.hpp;h=1b8bd642de9b885614972a19250da54824b05e2b;hb=b6bbb1d666531bf061f29884da1b0d7c10f59aa0;hp=6d629e2beff51dbe35268ca8b8f4721bf7e4031b;hpb=d7bfb9b0fa35679d3e728b9165699d9faf905539;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/tsdl-trace-class-visitor.hpp b/src/bin/lttng-sessiond/tsdl-trace-class-visitor.hpp index 6d629e2be..1b8bd642d 100644 --- a/src/bin/lttng-sessiond/tsdl-trace-class-visitor.hpp +++ b/src/bin/lttng-sessiond/tsdl-trace-class-visitor.hpp @@ -15,6 +15,7 @@ #include #include +#include namespace lttng { namespace sessiond { @@ -22,36 +23,73 @@ namespace tsdl { using append_metadata_fragment_function = std::function; +namespace details { +/* + * Register types to be overriden. For example, a TSDL-safe copy of a type can + * be added to be overriden whenever the original type is encountered. + * + * Note that this class assumes no ownership of the original types. It assumes + * that the original types live as long as the original trace. + */ +class type_overrider { +public: + type_overrider() = default; + + void publish(const lttng::sessiond::trace::type& original, + lttng::sessiond::trace::type::cuptr new_type_override); + const lttng::sessiond::trace::type& type( + const lttng::sessiond::trace::type& original) const noexcept; + +private: + std::unordered_map + _overriden_types; +}; +} /* namespace details. */ + +/* + * TSDL-producing trace class visitor. + * + * An instance of this class must not be used on multiple trace class instances. + * The `append_metadata` callback is automatically invoked when a coherent + * fragment of TSDL is available. + */ class trace_class_visitor : public lttng::sessiond::trace::trace_class_visitor { public: trace_class_visitor(const lttng::sessiond::trace::abi& trace_abi, append_metadata_fragment_function append_metadata); - /* trace class visitor interface. */ virtual void visit(const lttng::sessiond::trace::trace_class& trace_class) override final; - - /* clock class visitor interface. */ virtual void visit(const lttng::sessiond::trace::clock_class& clock_class) override final; - - /* environment visitor interface. */ - virtual void environment_begin() override final; - virtual void visit(const lttng::sessiond::trace::environment_field& field) override final; - virtual void visit(const lttng::sessiond::trace::environment_field& field) override final; - virtual void environment_end() override final; - - /* stream class visitor interface. */ virtual void visit(const lttng::sessiond::trace::stream_class& stream_class) override final; - - /* event class visitor interface. */ virtual void visit(const lttng::sessiond::trace::event_class& event_class) override final; private: /* Coherent (parseable) fragments must be appended. */ void append_metadata_fragment(const std::string& fragment) const; + const lttng::sessiond::trace::type& _lookup_field_type( + const lttng::sessiond::trace::field_location& field_location) const; const lttng::sessiond::trace::abi& _trace_abi; const append_metadata_fragment_function _append_metadata_fragment; - std::string _environment; + details::type_overrider _sanitized_types_overrides; + + /* + * Current visit context. + * + * The members of a trace class hierarchy do not provide back-references + * up the hierarchy (e.g. stream class to its parent trace class). + * + * This context allows the visitor to evaluate a "field location". + * + * _current_trace_class is set the first time a trace class is visited and + * remains valid until the destruction of this object. + * + * _current_stream_class and _current_event_class are set only in the + * context of the visit of a stream class and of its event class(es). + */ + const lttng::sessiond::trace::trace_class *_current_trace_class = nullptr; + const lttng::sessiond::trace::stream_class *_current_stream_class = nullptr; + const lttng::sessiond::trace::event_class *_current_event_class = nullptr; }; } /* namespace tsdl */