X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fust-registry-channel.cpp;h=ed8a60daf2509fd191ec273fc3b0be866df6a4f4;hb=0267b5278de7bf4ee1ec11f2270dec4b44e80f36;hp=d03c89c6e832cbc28cfcda045eec4a1096fb9de6;hpb=d7bfb9b0fa35679d3e728b9165699d9faf905539;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/ust-registry-channel.cpp b/src/bin/lttng-sessiond/ust-registry-channel.cpp index d03c89c6e..ed8a60daf 100644 --- a/src/bin/lttng-sessiond/ust-registry-channel.cpp +++ b/src/bin/lttng-sessiond/ust-registry-channel.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include namespace lst = lttng::sessiond::trace; @@ -48,12 +49,7 @@ int ht_match_event(struct cds_lfht_node *node, const void *_key) LTTNG_ASSERT(node); LTTNG_ASSERT(_key); - DIAGNOSTIC_PUSH - DIAGNOSTIC_IGNORE_INVALID_OFFSETOF - event = caa_container_of(node, lttng::sessiond::ust::registry_event, _node.node); - DIAGNOSTIC_POP - - LTTNG_ASSERT(event); + event = lttng::utils::container_of(node, <tng::sessiond::ust::registry_event::_node); key = (lttng::sessiond::ust::registry_event *) _key; /* It has to be a perfect match. First, compare the event names. */ @@ -82,15 +78,199 @@ int ht_match_event(struct cds_lfht_node *node, const void *_key) no_match: return 0; } + +lst::type::cuptr create_event_header(const lst::abi& trace_abi, lst::stream_class::header_type header_type) +{ + lst::structure_type::fields event_header_fields; + + if (header_type == lst::stream_class::header_type::COMPACT) { + auto enum_mappings = std::make_shared(); + + enum_mappings->emplace_back("compact", lst::unsigned_enumeration_type::mapping::range_t(0, 30)); + enum_mappings->emplace_back("extended"); + + lst::type::cuptr choice_enum = lttng::make_unique(1, + trace_abi.byte_order, 5, lst::integer_type::base::DECIMAL, + std::move(enum_mappings), + std::initializer_list( + {lst::integer_type::role::EVENT_RECORD_CLASS_ID})); + + lst::variant_type::choices variant_choices; + + lst::structure_type::fields compact_fields; + compact_fields.emplace_back(lttng::make_unique("timestamp", + lttng::make_unique(1, trace_abi.byte_order, 27, + lst::integer_type::signedness::UNSIGNED, + lst::integer_type::base::DECIMAL, + std::initializer_list({lst::integer_type::role:: + DEFAULT_CLOCK_TIMESTAMP})))); + + lst::type::cuptr compact = lttng::make_unique( + 0, std::move(compact_fields)); + variant_choices.emplace_back(lttng::make_unique("compact", std::move(compact))); + + lst::structure_type::fields extended_fields; + extended_fields.emplace_back(lttng::make_unique("id", + lttng::make_unique(trace_abi.uint32_t_alignment, + trace_abi.byte_order, 32, + lst::integer_type::signedness::UNSIGNED, + lst::integer_type::base::DECIMAL, + std::initializer_list({lst::integer_type::role:: + EVENT_RECORD_CLASS_ID})))); + extended_fields.emplace_back(lttng::make_unique("timestamp", + lttng::make_unique(trace_abi.uint64_t_alignment, + trace_abi.byte_order, 64, + lst::integer_type::signedness::UNSIGNED, + lst::integer_type::base::DECIMAL, + std::initializer_list({lst::integer_type::role:: + DEFAULT_CLOCK_TIMESTAMP})))); + + lst::type::cuptr extended = lttng::make_unique(0, std::move(extended_fields)); + variant_choices.emplace_back(lttng::make_unique("extended", std::move(extended))); + + lst::type::cuptr variant = lttng::make_unique( + 0, "id", std::move(variant_choices)); + + event_header_fields.emplace_back(lttng::make_unique("id", std::move(choice_enum))); + event_header_fields.emplace_back( + lttng::make_unique("v", std::move(variant))); + } else { + auto enum_mappings = std::make_shared(); + + enum_mappings->emplace_back("compact", lst::unsigned_enumeration_type::mapping::range_t(0, 65534)); + enum_mappings->emplace_back("extended"); + + lst::type::cuptr choice_enum = lttng::make_unique( + trace_abi.uint16_t_alignment, trace_abi.byte_order, 16, + lst::integer_type::base::DECIMAL, std::move(enum_mappings), + std::initializer_list( + {lst::integer_type::role::EVENT_RECORD_CLASS_ID})); + + lst::variant_type::choices variant_choices; + + lst::structure_type::fields compact_fields; + compact_fields.emplace_back(lttng::make_unique("timestamp", + lttng::make_unique(trace_abi.uint32_t_alignment, + trace_abi.byte_order, 32, + lst::integer_type::signedness::UNSIGNED, + lst::integer_type::base::DECIMAL, + std::initializer_list({lst::integer_type::role:: + DEFAULT_CLOCK_TIMESTAMP})))); + + lst::type::cuptr compact = lttng::make_unique( + 0, std::move(compact_fields)); + variant_choices.emplace_back( + lttng::make_unique("compact", std::move(compact))); + + lst::structure_type::fields extended_fields; + extended_fields.emplace_back(lttng::make_unique("id", + lttng::make_unique(trace_abi.uint32_t_alignment, + trace_abi.byte_order, 32, + lst::integer_type::signedness::UNSIGNED, + lst::integer_type::base::DECIMAL, + std::initializer_list({lst::integer_type::role:: + EVENT_RECORD_CLASS_ID})))); + extended_fields.emplace_back(lttng::make_unique("timestamp", + lttng::make_unique(trace_abi.uint64_t_alignment, + trace_abi.byte_order, 64, + lst::integer_type::signedness::UNSIGNED, + lst::integer_type::base::DECIMAL, + std::initializer_list({lst::integer_type::role:: + DEFAULT_CLOCK_TIMESTAMP})))); + + lst::type::cuptr extended = lttng::make_unique(0, std::move(extended_fields)); + variant_choices.emplace_back(lttng::make_unique("extended", std::move(extended))); + + lst::type::cuptr variant = lttng::make_unique( + 0, "id", std::move(variant_choices)); + + event_header_fields.emplace_back(lttng::make_unique("id", std::move(choice_enum))); + event_header_fields.emplace_back( + lttng::make_unique("v", std::move(variant))); + } + + return lttng::make_unique(0, std::move(event_header_fields)); +} + +lst::type::cuptr create_packet_context(const lst::abi& trace_abi) +{ + lst::structure_type::fields packet_context_fields; + + /* uint64_t timestamp_begin */ + packet_context_fields.emplace_back(lttng::make_unique("timestamp_begin", + lttng::make_unique(trace_abi.uint64_t_alignment, + trace_abi.byte_order, 64, + lst::integer_type::signedness::UNSIGNED, + lst::integer_type::base::DECIMAL, + std::initializer_list({lst::integer_type::role::DEFAULT_CLOCK_TIMESTAMP})))); + + /* uint64_t timestamp_end */ + packet_context_fields.emplace_back(lttng::make_unique("timestamp_end", + lttng::make_unique(trace_abi.uint64_t_alignment, + trace_abi.byte_order, 64, + lst::integer_type::signedness::UNSIGNED, + lst::integer_type::base::DECIMAL, + std::initializer_list({lst::integer_type::role::PACKET_END_DEFAULT_CLOCK_TIMESTAMP})))); + + /* uint64_t content_size */ + packet_context_fields.emplace_back(lttng::make_unique("content_size", + lttng::make_unique(trace_abi.uint64_t_alignment, + trace_abi.byte_order, 64, + lst::integer_type::signedness::UNSIGNED, + lst::integer_type::base::DECIMAL, + std::initializer_list({lst::integer_type::role::PACKET_CONTENT_LENGTH})))); + + /* uint64_t packet_size */ + packet_context_fields.emplace_back(lttng::make_unique("packet_size", + lttng::make_unique(trace_abi.uint64_t_alignment, + trace_abi.byte_order, 64, + lst::integer_type::signedness::UNSIGNED, + lst::integer_type::base::DECIMAL, + std::initializer_list({lst::integer_type::role::PACKET_TOTAL_LENGTH})))); + + /* uint64_t packet_seq_num */ + packet_context_fields.emplace_back(lttng::make_unique("packet_seq_num", + lttng::make_unique(trace_abi.uint64_t_alignment, + trace_abi.byte_order, 64, + lst::integer_type::signedness::UNSIGNED, + lst::integer_type::base::DECIMAL, + std::initializer_list({lst::integer_type::role::PACKET_SEQUENCE_NUMBER})))); + + /* unsigned long events_discarded */ + packet_context_fields.emplace_back(lttng::make_unique("events_discarded", + lttng::make_unique(trace_abi.long_alignment, + trace_abi.byte_order, trace_abi.bits_per_long, + lst::integer_type::signedness::UNSIGNED, + lst::integer_type::base::DECIMAL, + std::initializer_list({lst::integer_type::role::DISCARDED_EVENT_RECORD_COUNTER_SNAPSHOT})))); + + /* uint32_t cpu_id */ + packet_context_fields.emplace_back(lttng::make_unique("cpu_id", + lttng::make_unique(trace_abi.uint32_t_alignment, + trace_abi.byte_order, 32, + lst::integer_type::signedness::UNSIGNED, + lst::integer_type::base::DECIMAL))); + + return lttng::make_unique(0, std::move(packet_context_fields)); +} }; /* namespace */ lsu::registry_channel::registry_channel(unsigned int channel_id, + const lst::abi& trace_abi, + std::string in_default_clock_class_name, lsu::registry_channel::registered_listener_fn channel_registered_listener, lsu::registry_channel::event_added_listener_fn event_added_listener) : - lst::stream_class(channel_id, lst::stream_class::header_type::LARGE), + lst::stream_class(channel_id, + lst::stream_class::header_type::LARGE, + std::move(in_default_clock_class_name)), _key{-1ULL}, _consumer_key{-1ULL}, - _metadata_dumped{false}, _next_event_id{0}, _is_registered_listener{channel_registered_listener}, _event_added_listener{event_added_listener}, @@ -104,6 +284,16 @@ lsu::registry_channel::registry_channel(unsigned int channel_id, /* Set custom match function. */ _events->match_fct = ht_match_event; _events->hash_fct = ht_hash_event; + + _rcu_head = {}; + /* + * Node's key is initialized by the channel's parent session. Its value is irrelevant to the + * channel object itself. + */ + _node = {}; + + _packet_context = create_packet_context(trace_abi); + _event_header = create_event_header(trace_abi, header_type_); } void lsu::registry_channel::add_event( @@ -158,18 +348,15 @@ void lsu::registry_channel::add_event( * are matched using the event name and signature. */ nptr = cds_lfht_add_unique(_events->ht, _events->hash_fct(event.get(), lttng_ht_seed), - _events->match_fct, event.get(), &event->_node.node); - if (nptr != &event->_node.node) { + _events->match_fct, event.get(), &event->_node); + if (nptr != &event->_node) { if (buffer_type == LTTNG_BUFFER_PER_UID) { /* * This is normal, we just have to send the event id of the * returned node. */ - DIAGNOSTIC_PUSH - DIAGNOSTIC_IGNORE_INVALID_OFFSETOF - const auto existing_event = caa_container_of( - nptr, lttng::sessiond::ust::registry_event, _node.node); - DIAGNOSTIC_POP + const auto existing_event = lttng::utils::container_of( + nptr, <tng::sessiond::ust::registry_event::_node); event_id = existing_event->id; } else { LTTNG_THROW_INVALID_ARGUMENT_ERROR(fmt::format( @@ -201,17 +388,17 @@ lsu::registry_channel::~registry_channel() lttng_ht_destroy(_events); } -const lttng::sessiond::trace::type& lsu::registry_channel::get_context() const +const lttng::sessiond::trace::type* lsu::registry_channel::get_event_context() const { LTTNG_ASSERT(_is_registered); - return lst::stream_class::get_context(); + return lst::stream_class::get_event_context(); } -void lsu::registry_channel::set_context(lttng::sessiond::trace::type::cuptr context) +void lsu::registry_channel::set_event_context(lttng::sessiond::trace::type::cuptr context) { /* Must only be set once, on the first channel registration provided by an application. */ - LTTNG_ASSERT(!_context); - _context = std::move(context); + LTTNG_ASSERT(!_event_context); + _event_context = std::move(context); } bool lsu::registry_channel::is_registered() const @@ -239,7 +426,7 @@ void lsu::registry_channel::_accept_on_event_classes( DIAGNOSTIC_PUSH DIAGNOSTIC_IGNORE_INVALID_OFFSETOF - cds_lfht_for_each_entry(_events->ht, &iter.iter, event, _node.node) { + cds_lfht_for_each_entry(_events->ht, &iter.iter, event, _node) { sorted_event_classes.emplace_back(event); } DIAGNOSTIC_POP