[lttng-dev] [PATCH lttng-ust] Perform the sem_wait on the constructor semaphore just before the main
Jérémie Galarneau
jeremie.galarneau at efficios.com
Sat Nov 15 14:12:38 EST 2014
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
More information about the lttng-dev
mailing list