-#ifndef _LTTNG_TRACEPOINT_H
-#define _LTTNG_TRACEPOINT_H
-
/*
- * Copyright 2011-2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
+ * SPDX-License-Identifier: MIT
+ *
+ * Copyright (C) 2011-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
*/
+#ifndef _LTTNG_TRACEPOINT_H
+#define _LTTNG_TRACEPOINT_H
+
#include <stdio.h>
#include <stdlib.h>
#include <lttng/tracepoint-types.h>
/*
* tracepoint dynamic linkage handling (callbacks). Hidden visibility:
* shared across objects in a module/main executable.
+ *
+ * IMPORTANT: this structure is part of the ABI between instrumented
+ * applications and UST. Fields need to be only added at the end, never
+ * reordered, never removed.
+ *
+ * The field @struct_size should be used to determine the size of the
+ * structure. It should be queried before using additional fields added
+ * at the end of the structure.
*/
struct lttng_ust_tracepoint_dlopen {
+ uint32_t struct_size;
+
void *liblttngust_handle;
int (*tracepoint_register_lib)(struct lttng_ust_tracepoint * const *tracepoints_start,
void (*rcu_read_lock_sym)(void);
void (*rcu_read_unlock_sym)(void);
void *(*rcu_dereference_sym)(void *p);
+
+ /* End of base ABI. Fields below should be used after checking struct_size. */
};
extern struct lttng_ust_tracepoint_dlopen tracepoint_dlopen;
int __tracepoint_ptrs_registered
__attribute__((weak, visibility("hidden")));
struct lttng_ust_tracepoint_dlopen tracepoint_dlopen
- __attribute__((weak, visibility("hidden")));
+ __attribute__((weak, visibility("hidden"))) = {
+ .struct_size = sizeof(struct lttng_ust_tracepoint_dlopen),
+};
/*
* Deal with gcc O1 optimisation issues with weak hidden symbols. gcc
* 4.8 and prior does not have the same behavior for symbol scoping on
* Tracepoint dynamic linkage handling (callbacks). Hidden visibility: shared
* across objects in a module/main executable. The callbacks are used to
* control and check if the destructors should be executed.
+ *
+ * IMPORTANT: this structure is part of the ABI between instrumented
+ * applications and UST. Fields need to be only added at the end, never
+ * reordered, never removed.
+ *
+ * The field @struct_size should be used to determine the size of the
+ * structure. It should be queried before using additional fields added
+ * at the end of the structure.
*/
struct lttng_ust_tracepoint_destructors_syms {
- int *old_tracepoint_disable_destructors;
+ uint32_t struct_size;
+
void (*tracepoint_disable_destructors)(void);
int (*tracepoint_get_destructors_state)(void);
+
+ /* End of base ABI. Fields below should be used after checking struct_size. */
};
extern struct lttng_ust_tracepoint_destructors_syms tracepoint_destructors_syms;
extern struct lttng_ust_tracepoint_destructors_syms *tracepoint_destructors_syms_ptr;
struct lttng_ust_tracepoint_destructors_syms tracepoint_destructors_syms
- __attribute__((weak, visibility("hidden")));
+ __attribute__((weak, visibility("hidden"))) = {
+ .struct_size = sizeof(struct lttng_ust_tracepoint_destructors_syms),
+};
struct lttng_ust_tracepoint_destructors_syms *tracepoint_destructors_syms_ptr
__attribute__((weak, visibility("hidden")));
if (tracepoint_dlopen_ptr->liblttngust_handle
&& tracepoint_destructors_syms_ptr->tracepoint_disable_destructors)
tracepoint_destructors_syms_ptr->tracepoint_disable_destructors();
- *tracepoint_destructors_syms_ptr->old_tracepoint_disable_destructors = 1;
}
#ifndef _LGPL_SOURCE
tracepoint_dlopen_ptr = &tracepoint_dlopen;
if (!tracepoint_dlopen_ptr->liblttngust_handle)
tracepoint_dlopen_ptr->liblttngust_handle =
- dlopen("liblttng-ust-tracepoint.so.0", RTLD_NOW | RTLD_GLOBAL);
+ dlopen("liblttng-ust-tracepoint.so.1", RTLD_NOW | RTLD_GLOBAL);
if (!tracepoint_dlopen_ptr->liblttngust_handle)
return;
__tracepoint__init_urcu_sym();
*/
return;
}
- /*
- * Lookup if destructors must be executed using the old method.
- */
- if (tracepoint_destructors_syms_ptr->old_tracepoint_disable_destructors
- && *tracepoint_destructors_syms_ptr->old_tracepoint_disable_destructors) {
- /*
- * The old_tracepoint_disable_destructors symbol was found with
- * dlsym but its value is 1 meaning that destructors must not
- * be executed.
- */
- return;
- }
-
ret = dlclose(tracepoint_dlopen_ptr->liblttngust_handle);
if (ret) {
fprintf(stderr, "Error (%d) in dlclose\n", ret);
__attribute__((section("__tracepoints_strings"))) = \
#_provider ":" #_name; \
struct lttng_ust_tracepoint __tracepoint_##_provider##___##_name \
- __attribute__((section("__tracepoints"))) = \
- { \
+ __attribute__((section("__tracepoints"))) = { \
+ sizeof(struct lttng_ust_tracepoint), \
__tp_strtab_##_provider##___##_name, \
0, \
NULL, \
_TRACEPOINT_UNDEFINED_REF(_provider), \
_TP_EXTRACT_STRING(_args), \
- { }, \
}; \
static struct lttng_ust_tracepoint * \
__tracepoint_ptr_##_provider##___##_name \
tracepoint_dlopen_ptr = &tracepoint_dlopen;
if (!tracepoint_dlopen_ptr->liblttngust_handle)
tracepoint_dlopen_ptr->liblttngust_handle =
- dlopen("liblttng-ust-tracepoint.so.0", RTLD_NOW | RTLD_GLOBAL);
+ dlopen("liblttng-ust-tracepoint.so.1", RTLD_NOW | RTLD_GLOBAL);
if (!tracepoint_dlopen_ptr->liblttngust_handle)
return;
if (!tracepoint_destructors_syms_ptr)
tracepoint_dlopen_ptr->tracepoint_register_lib =
URCU_FORCE_CAST(int (*)(struct lttng_ust_tracepoint * const *, int),
dlsym(tracepoint_dlopen_ptr->liblttngust_handle,
- "tracepoint_register_lib2"));
+ "tracepoint_register_lib"));
tracepoint_dlopen_ptr->tracepoint_unregister_lib =
URCU_FORCE_CAST(int (*)(struct lttng_ust_tracepoint * const *),
dlsym(tracepoint_dlopen_ptr->liblttngust_handle,
- "tracepoint_unregister_lib2"));
- tracepoint_destructors_syms_ptr->old_tracepoint_disable_destructors =
- URCU_FORCE_CAST(int *,
- dlsym(tracepoint_dlopen_ptr->liblttngust_handle,
- "__tracepoints__disable_destructors"));
+ "tracepoint_unregister_lib"));
tracepoint_destructors_syms_ptr->tracepoint_disable_destructors =
URCU_FORCE_CAST(void (*)(void),
dlsym(tracepoint_dlopen_ptr->liblttngust_handle,