bin: compile lttng-sessiond as C++ Same as commit 48a400056134 ("bin: compile lttng as C++"), but change lttng-sessiond to be a C++ program. In addition to the categories of changes already mentioned in that commit's message, here are some interesting changes: - Add an include in trigger.h, an exported header, to fix: CXX notification-thread.lo In file included from /home/simark/src/lttng-tools/src/bin/lttng-sessiond/notification-thread.cpp:9: /home/simark/src/lttng-tools/include/lttng/trigger/trigger.h:142:13: error: use of enum ‘lttng_error_code’ without previous declaration 142 | extern enum lttng_error_code lttng_register_trigger_with_name( | ^~~~~~~~~~~~~~~~ - We get this with clang: CXX lttng-conf.o In file included from /home/simark/src/lttng-tools/src/bin/lttng/conf.cpp:18: In file included from /home/simark/src/lttng-tools/src/common/common.h:14: In file included from /home/simark/src/lttng-tools/src/common/runas.h:17: In file included from /home/simark/src/lttng-tools/src/common/sessiond-comm/sessiond-comm.h:38: In file included from /home/simark/src/lttng-tools/src/common/unix.h:17: /home/simark/src/lttng-tools/src/common/payload-view.h:82:27: error: 'lttng_payload_view_from_payload' has C-linkage specified, but returns user-defined type 'struct lttng_payload_view' which is incompatible with C [-Werror,-Wreturn-type-c-linkage] struct lttng_payload_view lttng_payload_view_from_payload( ^ Turns out that because of the "const" field in lttng_payload_view, clang doesn't consider that type incompatible with C. I don't really want to remove the "const" for C code using that API, so conditionally remove it if we are compiling with clang in C++. - clang gives: CXX event.lo In file included from /home/simark/src/lttng-tools/src/bin/lttng-sessiond/event.cpp:19: /home/simark/src/lttng-tools/src/common/bytecode/bytecode.h:50:1: error: struct has size 0 in C, size 1 in C++ [-Werror,-Wextern-c-compat] struct literal_string { ^ It looks like that type isn't even used? Remove it. - it's not possible to initialize some union members, for example with lttcomm_consumer_msg, in consumer.cpp. Initialize it in a separate statement. - It's not possible to use the transparent union trick when calling urcu function, for example in thread_application_registration, in register.cpp. We need to instantiate a cds_wfcq_head_ptr_t object, assign the appropriate field, and pass that object to the function. - the ALIGNED_CONST_PTR trick does not work in C++: CXX consumer.lo In file included from /home/simark/src/lttng-tools/src/common/error.h:19, from /home/simark/src/lttng-tools/src/common/common.h:12, from /home/simark/src/lttng-tools/src/bin/lttng-sessiond/consumer.cpp:19: /home/simark/src/lttng-tools/src/bin/lttng-sessiond/consumer.cpp: In function ‘int consumer_send_relayd_socket(consumer_socket*, lttcomm_relayd_sock*, consumer_output*, lttng_stream_type, uint64_t, const char*, const char*, const char*, int, const uint64_t*, time_t, bool)’: /home/simark/src/lttng-tools/src/common/macros.h:116:58: error: expected primary-expression before ‘]’ token 116 | #define ALIGNED_CONST_PTR(value) (((const typeof(value) []) { value })) | ^ /home/simark/src/lttng-tools/src/bin/lttng-sessiond/consumer.cpp:1192:48: note: in expansion of macro ‘ALIGNED_CONST_PTR’ 1192 | ret = consumer_send_fds(consumer_sock, ALIGNED_CONST_PTR(rsock->sock.fd), 1); | ^~~~~~~~~~~~~~~~~ Replace uses with copying the data in a local variable (which is properly aligned), and pass the address to that variable to the function. - In consumer.h, an array field in a structure is defined using the max macro. It can't be replaced with std::max, since std::max isn't constexpr in C++11. Define a max_constexpr function locally and use it. - g++ 7 doesn't support non-trivial designated initializers, leading to errors like: CXX globals.lo /home/smarchi/src/lttng-tools/src/bin/lttng-sessiond/globals.cpp:44:1: sorry, unimplemented: non-trivial designated initializers not supported }; ^ Change consumer_data to have a constructor instead. Change initializations of some structures, such as lttcomm_lttng_msg, to initialize the fields separate from the variable declaration. This requires making these variable non-const which is not ideal. But once everything is C++, these types could get a fancy constructor, and then they can be made const again. - When compiling without UST support the stub versions of functions ust_app_rotate_session & co, in ust-app.h, are used. Some of them have the return type "enum lttng_error_code", but return 0, an invalid value, causing: CXX main.o In file included from /home/smarchi/src/lttng-tools/src/bin/lttng-sessiond/lttng-sessiond.h:22:0, from /home/smarchi/src/lttng-tools/src/bin/lttng-sessiond/main.cpp:45: /home/smarchi/src/lttng-tools/src/bin/lttng-sessiond/ust-app.h: In function ‘lttng_error_code ust_app_snapshot_record(ltt_ust_session*, const consumer_output*, int, uint64_t)’: /home/smarchi/src/lttng-tools/src/bin/lttng-sessiond/ust-app.h:575:9: error: invalid conversion from ‘int’ to ‘lttng_error_code’ [-fpermissive] return 0; ^ Change these functions to return LTTNG_ERR_UNK. These functions are not supposed to be called if UST support is not included. But even if they were: all their callers check that the return value is not LTTNG_OK. The value 0 would be considered an error, so will be LTTNG_ERR_UNK. Change-Id: I2cdd34459a54b1943087b43843ef20b35b7bf7d8 Signed-off-by: Simon Marchi <simon.marchi@efficios.com> Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Force usage of assert() condition when NDEBUG is defined Reuse the BT2 approach to force the usage of the assertion condition even when assert() are removed by the NDEBUG define. See `BT_USE_EXPR()` macro and documentation in Babeltrace commit[0]: commit 1778c2a4134647150b199b2b57130817144446b0 Author: Philippe Proulx <eeppeliteloop@gmail.com> Date: Tue Apr 21 11:15:42 2020 -0400 lib: assign a unique ID to each pre/postcond. and report it on failure 0: https://github.com/efficios/babeltrace/commit/1778c2a4134647150b199b2b57130817144446b0 Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com> Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com> Change-Id: I3844b6ae7e95952d90033898397ac936540b785c
Adapt to namespaced liblttng-ust-ctl symbols The liblttng-ust ABI bump gave us the opportunity to namespace all public symbols under the 'lttng_ust_' prefix. All of liblttng-ust-ctl public symbols were renamed from 'ustctl_' to 'lttng_ust_ctl_'. Adapt the tools codebase for this API change. Depends-on: lttng-ust: Ic2b9da019e7776b24b98824ae63d16b86c5a5742 Change-Id: I64b61a7fad86a1c0b4734a4a181f6ea7a9de7e24 Signed-off-by: Michael Jeanson <mjeanson@efficios.com> Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Adapt to lttng-ust ust-abi.h naming prefix update LTTng-UST updates all its ust-abi.h symbols and defines to use the lttng_ust_abi_ and LTTNG_UST_ABI_ prefixes. Adapt lttng-tools accordingly. Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com> Change-Id: Ifde8b73604c84ee37e9123f5dd912e7a806deb38 Depends-on: lttng-ust: I1273be9615846304266206769700e799bde4e51f
ust registry: Refactor representation of nested types Those allow LTTng-UST to internally represent nested types properly, and to serialize them when sending them over to the session daemon. However, for now, the session daemon only accepts arrays and sequences which contain an integer type, which is the only use-case emitted by lttng-ust. Wait until we have the nested types wired up within lttng-ust before accepting and supporting nested types so it can be tested. Given the size of this change to ust-metadata.c, use this opportunity to make sure that every if (ret) ... in this file is changed to conform to lttng-tools coding style: if (ret) { ... } Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com> Change-Id: I3ac44fc3a993f73d1fb08056331ad6fed7059981 Depends-on: lttng-ust: I45bb0886c5ac970c3ca75dbefcb94adb50801294
Move to kernel style SPDX license identifiers The SPDX identifier is a legally binding shorthand, which can be used instead of the full boiler plate text. See https://spdx.org/ids-how for details. Signed-off-by: Michael Jeanson <mjeanson@efficios.com> Change-Id: I62e7038e191a061286abcef5550b58f5ee67149d Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Replace libuuid with internal implementation We use a very small subset of libuuid features to transform UUIDs between their string and binary representation. Plus we have a lot of compat code for different platforms with some unspecified default behavior regarding the use of upper/lower case. Drop the dependency on libuuid and replace it with a minimal internal implementation that respects RFC4122. Signed-off-by: Michael Jeanson <mjeanson@efficios.com> Change-Id: I744e3cf65d6a22d0acf7a9943c10943ba64e8468 Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Clean-up: assert that get_count_order() returns a positive value The callers of get_count_order() don't handle negative values correctly. However, those should not happen without a previous bug. Assert that its return value is >= 0. Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Metadata: add env fields to ease lttng path hierarchy creation for viewer Add the following fields in the env section of the metadata: - trace_name The session name without datetime information. Hence when the session is an auto-generated one, only print LTTNG_DEFAULT_NAME. - trace_creation_datetime: The datetime at which the session was created. We use session->creation time for it. - tracer_buffering_scheme The buffering scheme used. The value can be uid or pid. - tracer_buffering_id The key used by the buffering scheme (uid/pid). - architecture_bit_width The bit width of the computer architecture (e.g 32 or 64) - vpid_datetime The registration time of the vpid for per-pid mode. Adding these fields ensure that the trace itself carry information that is normally carried via folder hierarchy. e.g test-20190417-174951/ <- trace_name, trace_creation_datetime └── ust <- domain └── uid <- tracer_buffering_scheme └── 1000 <- tracer_buffering_id └── 64-bit <- architecture_bit_width ├── channel0_0 ├── index │ ├── channel0_0.idx └── metadata Per-pid buffering is quite similar. auto-20190722-174816 <- trace_name, trace_creation_datetime └── ust <- domain └── pid <- tracer_buffering_scheme └── sample-ust-7640-20190722-174818 <- procname, tracer_buffering_id, vpid_datetime ├── my-channel_0 ├── index │ ├── my-channel_0.idx ├── metadata Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien@efficios.com> Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Fix: convey enum value signedness into metadata Currently, passing an enum range of: ctf_enum_range("blah", 0, UINT_MAX) in LTTng-UST will print a range of 0 ... -1 in the generated CTF metadata, which does not reflect signedness of the values. Also, struct ustctl_enum_entry is missing a LTTNG_PACKED attribute, which is against our protocol rules. This change needs to be pushed in locked-step into lttng-tools and lttng-ust, since it breaks the protocol between the two when UST uses the new enumeration type (introduced in 2.8.0-rc1). Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>