[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