In case of a fork prevent ust_lock_nocheck() in ust_before_fork() to be
executed before handle_pending_statedump() gets completed.

Signed-off-by: Paul Woegerer <[email protected]>
---
 liblttng-ust/lttng-ust-comm.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c
index 5df33f5..7cda59f 100644
--- a/liblttng-ust/lttng-ust-comm.c
+++ b/liblttng-ust/lttng-ust-comm.c
@@ -173,6 +173,7 @@ void ust_unlock(void)
  *   daemon problems).
  */
 static sem_t constructor_wait;
+static sem_t fork_child_wait;
 /*
  * Doing this for both the global and local sessiond.
  */
@@ -502,12 +503,16 @@ int handle_register_done(struct sock_info *sock_info)
 static
 void handle_pending_statedump(struct sock_info *sock_info)
 {
+       int ret;
        int ctor_passed = sock_info->constructor_sem_posted;
 
        if (ctor_passed && sock_info->statedump_pending) {
                sock_info->statedump_pending = 0;
                lttng_handle_pending_statedump(sock_info);
        }
+
+       ret = sem_post(&fork_child_wait);
+       assert(!ret);
 }
 
 static
@@ -1436,6 +1441,9 @@ void __attribute__((constructor)) lttng_ust_init(void)
        ret = sem_init(&constructor_wait, 0, 0);
        assert(!ret);
 
+       ret = sem_init(&fork_child_wait, 0, 0);
+       assert(!ret);
+
        ret = setup_local_apps();
        if (ret) {
                DBG("local apps setup returned %d", ret);
@@ -1627,6 +1635,12 @@ void ust_before_fork(sigset_t *save_sigset)
        if (ret == -1) {
                PERROR("sigprocmask");
        }
+
+       do {
+               ret = sem_wait(&fork_child_wait);
+       } while (ret < 0 && errno == EINTR);
+       assert(!ret);
+
        ust_lock_nocheck();
        rcu_bp_before_fork();
 }
-- 
2.0.0


_______________________________________________
lttng-dev mailing list
[email protected]
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to