X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-ust-comm.c;h=8c864f8ce595621434cfac4a08dec1aa705d5671;hb=3b8b68e73ec9b2b3cf550048046d3f7f69050688;hp=12385dfca95762d32839b4e5917a92f8b82b4c58;hpb=dc43c97f077c92fd1d90c898496120c08ca571a7;p=lttng-ust.git diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c index 12385dfc..8c864f8c 100644 --- a/liblttng-ust/lttng-ust-comm.c +++ b/liblttng-ust/lttng-ust-comm.c @@ -78,6 +78,12 @@ static sem_t constructor_wait; */ static int sem_count = { 2 }; +/* + * Counting nesting within lttng-ust. Used to ensure that calling fork() + * from liblttng-ust does not execute the pre/post fork handlers. + */ +static int __thread lttng_ust_nest_count; + /* * Info about socket and associated listener thread. */ @@ -469,7 +475,9 @@ int get_wait_shm(struct sock_info *sock_info, size_t mmap_size) * If the open failed because the file did not exist, try * creating it ourself. */ + lttng_ust_nest_count++; pid = fork(); + lttng_ust_nest_count--; if (pid > 0) { int status; @@ -883,15 +891,20 @@ void __attribute__((constructor)) lttng_ust_init(void) sigfillset(&sig_all_blocked); ret = pthread_sigmask(SIG_SETMASK, &sig_all_blocked, &orig_parent_mask); if (ret) { - PERROR("pthread_sigmask: %s", strerror(ret)); + ERR("pthread_sigmask: %s", strerror(ret)); } ret = pthread_create(&global_apps.ust_listener, NULL, ust_listener_thread, &global_apps); - + if (ret) { + ERR("pthread_create global: %s", strerror(ret)); + } if (local_apps.allowed) { ret = pthread_create(&local_apps.ust_listener, NULL, ust_listener_thread, &local_apps); + if (ret) { + ERR("pthread_create local: %s", strerror(ret)); + } } else { handle_register_done(&local_apps); } @@ -899,7 +912,7 @@ void __attribute__((constructor)) lttng_ust_init(void) /* Restore original signal mask in parent */ ret = pthread_sigmask(SIG_SETMASK, &orig_parent_mask, NULL); if (ret) { - PERROR("pthread_sigmask: %s", strerror(ret)); + ERR("pthread_sigmask: %s", strerror(ret)); } switch (timeout_mode) { @@ -975,12 +988,14 @@ void __attribute__((destructor)) lttng_ust_exit(void) /* cancel threads */ ret = pthread_cancel(global_apps.ust_listener); if (ret) { - ERR("Error cancelling global ust listener thread"); + ERR("Error cancelling global ust listener thread: %s", + strerror(ret)); } if (local_apps.allowed) { ret = pthread_cancel(local_apps.ust_listener); if (ret) { - ERR("Error cancelling local ust listener thread"); + ERR("Error cancelling local ust listener thread: %s", + strerror(ret)); } } /* @@ -1012,6 +1027,8 @@ void ust_before_fork(sigset_t *save_sigset) sigset_t all_sigs; int ret; + if (lttng_ust_nest_count) + return; /* Disable signals */ sigfillset(&all_sigs); ret = sigprocmask(SIG_BLOCK, &all_sigs, save_sigset); @@ -1037,6 +1054,8 @@ static void ust_after_fork_common(sigset_t *restore_sigset) void ust_after_fork_parent(sigset_t *restore_sigset) { + if (lttng_ust_nest_count) + return; DBG("process %d", getpid()); rcu_bp_after_fork_parent(); /* Release mutexes and reenable signals */ @@ -1054,6 +1073,8 @@ void ust_after_fork_parent(sigset_t *restore_sigset) */ void ust_after_fork_child(sigset_t *restore_sigset) { + if (lttng_ust_nest_count) + return; DBG("process %d", getpid()); /* Release urcu mutexes */ rcu_bp_after_fork_child();