[lttng-dev] [PATCH lttng-ust] Perform the sem_wait on the constructor semaphore just before the main
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Sat Nov 15 14:18:06 EST 2014
Can you extend the changelog by any chance, for instance by
explaining why we need this ? Something along the lines of
fixing deadlocks involving the glibc internal dynamic loader
lock would be good.
Thanks,
Mathieu
----- Original Message -----
> From: "Jérémie Galarneau" <jeremie.galarneau at efficios.com>
> To: lttng-dev at lists.lttng.org
> Cc: "mathieu desnoyers" <mathieu.desnoyers at efficios.com>, "Jérémie Galarneau" <jeremie.galarneau at efficios.com>
> Sent: Saturday, November 15, 2014 8:12:38 PM
> Subject: [PATCH lttng-ust] Perform the sem_wait on the constructor semaphore just before the main
>
> Signed-off-by: Jérémie Galarneau <jeremie.galarneau at efficios.com>
> ---
> liblttng-ust/Makefile.am | 7 ++++
> liblttng-ust/lttng-ust-comm.c | 75
> ++++++++++++++++++++++++++++---------------
> 2 files changed, 56 insertions(+), 26 deletions(-)
>
> diff --git a/liblttng-ust/Makefile.am b/liblttng-ust/Makefile.am
> index e2e1baa..802d32d 100644
> --- a/liblttng-ust/Makefile.am
> +++ b/liblttng-ust/Makefile.am
> @@ -83,4 +83,11 @@ liblttng_ust_la_LIBADD = \
> liblttng-ust-tracepoint.la \
> liblttng-ust-runtime.la liblttng-ust-support.la
>
> +if LTTNG_UST_BUILD_WITH_LIBDL
> +liblttng_ust_la_LIBADD += -ldl
> +endif
> +if LTTNG_UST_BUILD_WITH_LIBC_DL
> +liblttng_ust_la_LIBADD += -lc
> +endif
> +
> liblttng_ust_la_CFLAGS = -DUST_COMPONENT="liblttng_ust" -fno-strict-aliasing
> diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c
> index 3df2adc..8258e85 100644
> --- a/liblttng-ust/lttng-ust-comm.c
> +++ b/liblttng-ust/lttng-ust-comm.c
> @@ -20,6 +20,7 @@
> */
>
> #define _LGPL_SOURCE
> +#define _GNU_SOURCE
> #include <sys/types.h>
> #include <sys/socket.h>
> #include <sys/mman.h>
> @@ -52,6 +53,7 @@
> #include "compat.h"
> #include "../libringbuffer/tlsfixup.h"
> #include "lttng-ust-baddr.h"
> +#include <lttng/ust-dlfcn.h>
>
> /*
> * Has lttng ust comm constructor been called ?
> @@ -1405,10 +1407,8 @@ void lttng_ust_malloc_wrapper_init(void)
> */
> void __attribute__((constructor)) lttng_ust_init(void)
> {
> - struct timespec constructor_timeout;
> sigset_t sig_all_blocked, orig_parent_mask;
> pthread_attr_t thread_attr;
> - int timeout_mode;
> int ret;
>
> if (uatomic_xchg(&initialized, 1) == 1)
> @@ -1446,8 +1446,6 @@ void __attribute__((constructor)) lttng_ust_init(void)
> */
> lttng_ust_malloc_wrapper_init();
>
> - timeout_mode = get_constructor_timeout(&constructor_timeout);
> -
> ret = sem_init(&constructor_wait, 0, 0);
> assert(!ret);
>
> @@ -1507,28 +1505,6 @@ void __attribute__((constructor)) lttng_ust_init(void)
> if (ret) {
> ERR("pthread_sigmask: %s", strerror(ret));
> }
> -
> - switch (timeout_mode) {
> - case 1: /* timeout wait */
> - do {
> - ret = sem_timedwait(&constructor_wait,
> - &constructor_timeout);
> - } while (ret < 0 && errno == EINTR);
> - if (ret < 0 && errno == ETIMEDOUT) {
> - ERR("Timed out waiting for lttng-sessiond");
> - } else {
> - assert(!ret);
> - }
> - break;
> - case -1:/* wait forever */
> - do {
> - ret = sem_wait(&constructor_wait);
> - } while (ret < 0 && errno == EINTR);
> - assert(!ret);
> - break;
> - case 0: /* no timeout */
> - break;
> - }
> }
>
> static
> @@ -1703,3 +1679,50 @@ void lttng_ust_sockinfo_session_enabled(void *owner)
> struct sock_info *sock_info = owner;
> sock_info->statedump_pending = 1;
> }
> +
> +int __libc_start_main(int (*main) (int, char **, char **), int argc,
> + char **ubp_av, void (*init) (void), void (*fini) (void),
> + void (*rtld_fini) (void), void (*stack_end))
> +{
> + int ret;
> + int timeout_mode;
> + struct timespec constructor_timeout;
> + int (*libc_main_func)(int (*main) (int, char **, char **),
> + int argc, char **ubp_av, void (*init) (void),
> + void (*fini) (void), void (*rtld_fini) (void),
> + void (*stack_end));
> +
> + /* Retrieve the original __libc_start_main function */
> + libc_main_func = dlsym(RTLD_NEXT, "__libc_start_main");
> + if (libc_main_func == NULL) {
> + ERR("unable to find \"__libc_start_main\" symbol\n");
> + errno = ENOSYS;
> + return -1;
> + }
> +
> + timeout_mode = get_constructor_timeout(&constructor_timeout);
> + switch (timeout_mode) {
> + case 1: /* timeout wait */
> + do {
> + ret = sem_timedwait(&constructor_wait,
> + &constructor_timeout);
> + } while (ret < 0 && errno == EINTR);
> + if (ret < 0 && errno == ETIMEDOUT) {
> + ERR("Timed out waiting for lttng-sessiond");
> + } else {
> + assert(!ret);
> + }
> + break;
> + case -1:/* wait forever */
> + do {
> + ret = sem_wait(&constructor_wait);
> + } while (ret < 0 && errno == EINTR);
> + assert(!ret);
> + break;
> + case 0: /* no timeout */
> + break;
> + }
> +
> + /* Call the original function */
> + return libc_main_func(main, argc, ubp_av, init, fini, rtld_fini,
> stack_end);
> +}
> --
> 2.1.3
>
>
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list