X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=libust%2Flttng-ust-comm.c;h=ee187f8b9308f8d41dd50b9f76611a938506827b;hb=edaa143197d094019217dafbe2b291c660d2cf12;hp=04a32676b0a0a7755b6fbc6d8392f810145e7ba8;hpb=49deb55988d873a8b8084ca75644b7d61c7a047c;p=lttng-ust.git diff --git a/libust/lttng-ust-comm.c b/libust/lttng-ust-comm.c index 04a32676..ee187f8b 100644 --- a/libust/lttng-ust-comm.c +++ b/libust/lttng-ust-comm.c @@ -23,15 +23,22 @@ #include #include #include -#include -#include -#include #include #include #include #include #include +#include +#include +#include +#include + +/* + * Has lttng ust comm constructor been called ? + */ +static int initialized; + /* * communication thread mutex. Held when handling a command, also held * by fork() to deal with removal of threads, and by exit path. @@ -66,6 +73,7 @@ struct sock_info { int socket; pthread_t ust_listener; /* listener thread */ int root_handle; + int constructor_sem_posted;; }; /* Socket from app (connect) to session daemon (listen) for communication */ @@ -84,6 +92,13 @@ struct sock_info local_apps = { .root_handle = -1, }; +extern void ltt_ring_buffer_client_overwrite_init(void); +extern void ltt_ring_buffer_client_discard_init(void); +extern void ltt_ring_buffer_metadata_client_init(void); +extern void ltt_ring_buffer_client_overwrite_exit(void); +extern void ltt_ring_buffer_client_discard_exit(void); +extern void ltt_ring_buffer_metadata_client_exit(void); + static int setup_local_apps_socket(void) { @@ -142,12 +157,17 @@ int send_reply(int sock, struct lttcomm_ust_reply *lur) } static -int handle_register_done(void) +int handle_register_done(struct sock_info *sock_info) { int ret; + if (sock_info->constructor_sem_posted) + return 0; + sock_info->constructor_sem_posted = 1; ret = uatomic_add_return(&sem_count, -1); + fprintf(stderr, "DEC ret %d\n", ret); if (ret == 0) { + fprintf(stderr, "POST\n"); ret = sem_post(&constructor_wait); assert(!ret); } @@ -180,7 +200,7 @@ int handle_message(struct sock_info *sock_info, switch (lum->cmd) { case LTTNG_UST_REGISTER_DONE: if (lum->handle == LTTNG_UST_ROOT_HANDLE) - ret = handle_register_done(); + ret = handle_register_done(sock_info); else ret = -EINVAL; break; @@ -275,7 +295,7 @@ restart: * If we cannot find the sessiond daemon, don't delay * constructor execution. */ - ret = handle_register_done(); + ret = handle_register_done(sock_info); assert(!ret); pthread_mutex_unlock(<tng_ust_comm_mutex); sleep(5); @@ -305,7 +325,7 @@ restart: * If we cannot register to the sessiond daemon, don't * delay constructor execution. */ - ret = handle_register_done(); + ret = handle_register_done(sock_info); assert(!ret); pthread_mutex_unlock(<tng_ust_comm_mutex); sleep(5); @@ -393,13 +413,26 @@ int get_timeout(struct timespec *constructor_timeout) */ /* TODO */ -void __attribute__((constructor)) lttng_ust_comm_init(void) +void __attribute__((constructor)) lttng_ust_init(void) { struct timespec constructor_timeout; int timeout_mode; int ret; + if (uatomic_xchg(&initialized, 1) == 1) + return; + + /* + * We want precise control over the order in which we construct + * our sub-libraries vs starting to receive commands from + * sessiond (otherwise leading to errors when trying to create + * sessiond before the init functions are completed). + */ init_usterr(); + init_tracepoint(); + ltt_ring_buffer_metadata_client_init(); + ltt_ring_buffer_client_overwrite_init(); + ltt_ring_buffer_client_discard_init(); timeout_mode = get_timeout(&constructor_timeout); @@ -439,7 +472,7 @@ void __attribute__((constructor)) lttng_ust_comm_init(void) } } -void __attribute__((destructor)) lttng_ust_comm_exit(void) +void __attribute__((destructor)) lttng_ust_exit(void) { int ret; @@ -476,4 +509,8 @@ void __attribute__((destructor)) lttng_ust_comm_exit(void) lttng_ust_abi_exit(); ltt_events_exit(); + ltt_ring_buffer_client_discard_exit(); + ltt_ring_buffer_client_overwrite_exit(); + ltt_ring_buffer_metadata_client_exit(); + exit_tracepoint(); }