X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fust-registry.hpp;fp=src%2Fbin%2Flttng-sessiond%2Fust-registry.hpp;h=627ae06c0a65ee91aa058e75123f8113df8042cd;hp=acfc92404bb6d906bd082403628acd07194f6724;hb=b0f2e8db59fcadc8f4b06a94175792be3c431004;hpb=d7bfb9b0fa35679d3e728b9165699d9faf905539 diff --git a/src/bin/lttng-sessiond/ust-registry.hpp b/src/bin/lttng-sessiond/ust-registry.hpp index acfc92404..627ae06c0 100644 --- a/src/bin/lttng-sessiond/ust-registry.hpp +++ b/src/bin/lttng-sessiond/ust-registry.hpp @@ -18,6 +18,7 @@ #include "ust-clock-class.hpp" #include "ust-registry-channel.hpp" #include "ust-registry-event.hpp" +#include "ust-registry-session.hpp" #include #include @@ -38,233 +39,12 @@ #define CTF_SPEC_MINOR 8 struct ust_app; -class ust_registry_session; - -namespace lttng { -namespace sessiond { -namespace details { -void locked_ust_registry_session_release(ust_registry_session *session); -} /* namespace details */ -} /* namespace sessiond */ -} /* namespace lttng */ - -class ust_registry_session : public lttng::sessiond::trace::trace_class { -public: - using locked_ptr = std::unique_ptr:: - deleter>; - - virtual lttng_buffer_type get_buffering_scheme() const noexcept = 0; - locked_ptr lock(); - - void add_channel(uint64_t channel_key); - lttng::sessiond::ust::registry_channel& get_channel(uint64_t channel_key) const; - void remove_channel(uint64_t channel_key, bool notify); - - void regenerate_metadata(); - virtual ~ust_registry_session(); - - /* - * With multiple writers and readers, use this lock to access - * the registry. Can nest within the ust app session lock. - * Also acts as a registry serialization lock. Used by registry - * readers to serialize the registry information sent from the - * sessiond to the consumerd. - * The consumer socket lock nests within this lock. - */ - mutable pthread_mutex_t _lock; - /* Next channel ID available for a newly registered channel. */ - uint32_t _next_channel_id = 0; - /* Once this value reaches UINT32_MAX, no more id can be allocated. */ - uint32_t _used_channel_id = 0; - /* Next enumeration ID available. */ - uint64_t _next_enum_id = 0; - - /* Generated metadata. */ - char *_metadata = nullptr; /* NOT null-terminated ! Use memcpy. */ - size_t _metadata_len = 0, _metadata_alloc_len = 0; - /* Length of bytes sent to the consumer. */ - size_t _metadata_len_sent = 0; - /* Current version of the metadata. */ - uint64_t _metadata_version = 0; - - /* - * Those fields are only used when a session is created with - * the --shm-path option. In this case, the metadata is output - * twice: once to the consumer, as ususal, but a second time - * also in the shm path directly. This is done so that a copy - * of the metadata that is as fresh as possible is available - * on the event of a crash. - * - * root_shm_path contains the shm-path provided by the user, along with - * the session's name and timestamp: - * e.g. /tmp/my_shm/my_session-20180612-135822 - * - * shm_path contains the full path of the memory buffers: - * e.g. /tmp/my_shm/my_session-20180612-135822/ust/uid/1000/64-bit - * - * metadata_path contains the full path to the metadata file that - * is kept for the "crash buffer" extraction: - * e.g. - * /tmp/my_shm/my_session-20180612-135822/ust/uid/1000/64-bit/metadata - * - * Note that this is not the trace's final metadata file. It is - * only meant to be used to read the contents of the ring buffers - * in the event of a crash. - * - * metadata_fd is a file descriptor that points to the file at - * 'metadata_path'. - */ - char _root_shm_path[PATH_MAX] = {}; - char _shm_path[PATH_MAX] = {}; - char _metadata_path[PATH_MAX] = {}; - /* File-backed metadata FD */ - int _metadata_fd = -1; - - /* - * Hash table containing channels sent by the UST tracer. MUST - * be accessed with a RCU read side lock acquired. - */ - lttng_ht::uptr _channels; - - /* - * Unique key to identify the metadata on the consumer side. - */ - uint64_t _metadata_key = 0; - /* - * Indicates if the metadata is closed on the consumer side. This is to - * avoid double close of metadata when an application unregisters AND - * deletes its sessions. - */ - bool _metadata_closed = false; - - /* User and group owning the session. */ - uid_t _uid = -1; - gid_t _gid = -1; - - /* Enumerations table. */ - lttng_ht::uptr _enums; - - /* - * Copy of the tracer version when the first app is registered. - * It is used if we need to regenerate the metadata. - */ - uint32_t _app_tracer_version_major = 0; - uint32_t _app_tracer_version_minor = 0; - - /* The id of the parent session */ - ltt_session::id_t _tracing_id = -1ULL; - -protected: - /* Prevent instanciation of this base class. */ - ust_registry_session(const struct lttng::sessiond::trace::abi& abi, - unsigned int app_tracer_version_major, - unsigned int app_tracer_version_minor, - const char *root_shm_path, - const char *shm_path, - uid_t euid, - gid_t egid, - uint64_t tracing_id); - virtual void _visit_environment( - lttng::sessiond::trace::trace_class_visitor& trace_class_visitor) - const override; - void _generate_metadata(); - -private: - uint32_t _get_next_channel_id(); - void _increase_metadata_size(size_t reservation_length); - void _append_metadata_fragment(const std::string& fragment); - void _reset_metadata(); - - virtual void _accept_on_clock_classes( - lttng::sessiond::trace::trace_class_visitor& trace_class_visitor) - const override final; - virtual void _accept_on_stream_classes( - lttng::sessiond::trace::trace_class_visitor& trace_class_visitor) - const override final; - - lttng::sessiond::ust::clock_class _clock; - const lttng::sessiond::trace::trace_class_visitor::cuptr _metadata_generating_visitor; -}; - -class ust_registry_session_per_uid : public ust_registry_session { -public: - ust_registry_session_per_uid(const struct lttng::sessiond::trace::abi& trace_abi, - uint32_t major, - uint32_t minor, - const char *root_shm_path, - const char *shm_path, - uid_t euid, - gid_t egid, - uint64_t tracing_id, - uid_t tracing_uid); - - virtual lttng_buffer_type get_buffering_scheme() const noexcept override final; - -private: - virtual void _visit_environment( - lttng::sessiond::trace::trace_class_visitor& trace_class_visitor) - const override final; - - const uid_t _tracing_uid; -}; - -class ust_registry_session_per_pid : public ust_registry_session { -public: - ust_registry_session_per_pid(const struct ust_app& app, - const struct lttng::sessiond::trace::abi& - trace_abi, - uint32_t major, - uint32_t minor, - const char *root_shm_path, - const char *shm_path, - uid_t euid, - gid_t egid, - uint64_t tracing_id); - - virtual lttng_buffer_type get_buffering_scheme() const noexcept override final; - -private: - virtual void _visit_environment( - lttng::sessiond::trace::trace_class_visitor& trace_class_visitor) - const override final; - - const unsigned int _tracer_patch_level_version; - const pid_t _vpid; - const std::string _procname; - const std::time_t _app_creation_time; -}; - namespace lttng { namespace sessiond { namespace ust { - -class registry_enum { -public: - using const_rcu_protected_reference = lttng::locked_reference; - - registry_enum(std::string name, enum lttng::sessiond::trace::integer_type::signedness signedness); - virtual ~registry_enum() = default; - - std::string name; - enum lttng::sessiond::trace::integer_type::signedness signedness; - /* enum id in session */ - uint64_t id = -1ULL; - /* Enumeration node in session hash table. */ - struct lttng_ht_node_str node; - /* For delayed reclaim. */ - struct rcu_head rcu_head; - - friend bool operator==(const registry_enum& lhs, const registry_enum& rhs) noexcept; -protected: - virtual bool _is_equal(const registry_enum& other) const noexcept = 0; -}; - -bool operator==(const registry_enum& lhs, const registry_enum& rhs) noexcept; - namespace details { + template typename trace::typed_enumeration_type::mapping mapping_from_ust_ctl_entry( const lttng_ust_ctl_enum_entry& entry) @@ -295,6 +75,29 @@ typename trace::typed_enumeration_type::mappings mappings_fr } } /* namespace details */ +class registry_enum { +public: + using const_rcu_protected_reference = lttng::locked_reference; + + registry_enum(std::string name, enum lttng::sessiond::trace::integer_type::signedness signedness); + virtual ~registry_enum() = default; + + std::string name; + enum lttng::sessiond::trace::integer_type::signedness signedness; + /* enum id in session */ + uint64_t id = -1ULL; + /* Enumeration node in session hash table. */ + struct lttng_ht_node_str node; + /* For delayed reclaim. */ + struct rcu_head rcu_head; + + friend bool operator==(const registry_enum& lhs, const registry_enum& rhs) noexcept; +protected: + virtual bool _is_equal(const registry_enum& other) const noexcept = 0; +}; + +bool operator==(const registry_enum& lhs, const registry_enum& rhs) noexcept; + template class registry_typed_enum : public registry_enum { public: @@ -340,7 +143,7 @@ using registry_unsigned_enum = registry_typed_enum; * * Return new instance on success, nullptr on error. */ -ust_registry_session *ust_registry_session_per_uid_create( +lttng::sessiond::ust::registry_session *ust_registry_session_per_uid_create( const lttng::sessiond::trace::abi& abi, uint32_t major, uint32_t minor, @@ -356,7 +159,7 @@ ust_registry_session *ust_registry_session_per_uid_create( * * Return new instance on success, nullptr on error. */ -ust_registry_session *ust_registry_session_per_pid_create(struct ust_app *app, +lttng::sessiond::ust::registry_session *ust_registry_session_per_pid_create(struct ust_app *app, const lttng::sessiond::trace::abi& abi, uint32_t major, uint32_t minor, @@ -365,24 +168,24 @@ ust_registry_session *ust_registry_session_per_pid_create(struct ust_app *app, uid_t euid, gid_t egid, uint64_t tracing_id); -void ust_registry_session_destroy(ust_registry_session *session); +void ust_registry_session_destroy(lttng::sessiond::ust::registry_session *session); void ust_registry_channel_destroy_event(lttng::sessiond::ust::registry_channel *chan, lttng::sessiond::ust::registry_event *event); -int ust_registry_create_or_find_enum(ust_registry_session *session, +int ust_registry_create_or_find_enum(lttng::sessiond::ust::registry_session *session, int session_objd, char *name, struct lttng_ust_ctl_enum_entry *entries, size_t nr_entries, uint64_t *enum_id); lttng::sessiond::ust::registry_enum::const_rcu_protected_reference -ust_registry_lookup_enum_by_id(const ust_registry_session *session, +ust_registry_lookup_enum_by_id(const lttng::sessiond::ust::registry_session *session, const char *name, uint64_t id); -void ust_registry_destroy_enum(ust_registry_session *reg_session, +void ust_registry_destroy_enum(lttng::sessiond::ust::registry_session *reg_session, lttng::sessiond::ust::registry_enum *reg_enum); #else /* HAVE_LIBLTTNG_UST_CTL */ static inline -ust_registry_session *ust_registry_session_per_uid_create( +lttng::sessiond::ust::registry_session *ust_registry_session_per_uid_create( uint32_t bits_per_long __attribute__((unused)), uint32_t uint8_t_alignment __attribute__((unused)), uint32_t uint16_t_alignment __attribute__((unused)), @@ -403,7 +206,7 @@ ust_registry_session *ust_registry_session_per_uid_create( } static inline -ust_registry_session *ust_registry_session_per_pid_create( +lttng::sessiond::ust::registry_session *ust_registry_session_per_pid_create( struct ust_app *app __attribute__((unused)), uint32_t bits_per_long __attribute__((unused)), uint32_t uint8_t_alignment __attribute__((unused)), @@ -425,7 +228,7 @@ ust_registry_session *ust_registry_session_per_pid_create( static inline void ust_registry_session_destroy( - ust_registry_session *session __attribute__((unused))) + lttng::sessiond::ust::registry_session *session __attribute__((unused))) {} static inline @@ -437,14 +240,14 @@ void ust_registry_destroy_event( /* The app object can be NULL for registry shared across applications. */ static inline int ust_metadata_session_statedump( - ust_registry_session *session __attribute__((unused))) + lttng::sessiond::ust::registry_session *session __attribute__((unused))) { return 0; } static inline int ust_metadata_channel_statedump( - ust_registry_session *session __attribute__((unused)), + lttng::sessiond::ust::registry_session *session __attribute__((unused)), lttng::sessiond::ust::registry_channel *chan __attribute__((unused))) { return 0; @@ -452,7 +255,7 @@ int ust_metadata_channel_statedump( static inline int ust_metadata_event_statedump( - ust_registry_session *session __attribute__((unused)), + lttng::sessiond::ust::registry_session *session __attribute__((unused)), lttng::sessiond::ust::registry_channel *chan __attribute__((unused)), lttng::sessiond::ust::registry_event *event __attribute__((unused))) { @@ -461,7 +264,7 @@ int ust_metadata_event_statedump( static inline int ust_registry_create_or_find_enum( - ust_registry_session *session __attribute__((unused)), + lttng::sessiond::ust::registry_session *session __attribute__((unused)), int session_objd __attribute__((unused)), char *name __attribute__((unused)), struct lttng_ust_ctl_enum_entry *entries __attribute__((unused)), @@ -474,7 +277,7 @@ int ust_registry_create_or_find_enum( static inline struct ust_registry_enum * ust_registry_lookup_enum_by_id( - const ust_registry_session *session __attribute__((unused)), + const lttng::sessiond::ust::registry_session *session __attribute__((unused)), const char *name __attribute__((unused)), uint64_t id __attribute__((unused))) { @@ -482,7 +285,7 @@ struct ust_registry_enum * } static inline -void ust_registry_destroy_enum(ust_registry_session *reg_session __attribute__((unused)), +void ust_registry_destroy_enum(lttng::sessiond::ust::registry_session *reg_session __attribute__((unused)), struct ust_registry_enum *reg_enum __attribute__((unused))) {}