Use liburcu-bp before/after fork (parent/child) callbacks
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 4 Mar 2011 17:31:32 +0000 (12:31 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 4 Mar 2011 17:32:52 +0000 (12:32 -0500)
Handle fork() gracefully with urcu-bp. Dependency on urcu-bp 0.5.4.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
libust/tracectl.c

index 0cff6fda9f035e8a009232268530e8e39e206ab4..830e777bb5114391e7525ca6713b138219125f38 100644 (file)
@@ -1697,6 +1697,7 @@ void ust_before_fork(ust_fork_info_t *fork_info)
         * Hold listen_sock_mutex to protect from listen_sock teardown.
         */
        pthread_mutex_lock(&listen_sock_mutex);
+       rcu_bp_before_fork();
 }
 
 /* Don't call this function directly in a traced program */
@@ -1717,24 +1718,20 @@ static void ust_after_fork_common(ust_fork_info_t *fork_info)
 
 void ust_after_fork_parent(ust_fork_info_t *fork_info)
 {
+       rcu_bp_after_fork_parent();
        /* Release mutexes and reenable signals */
        ust_after_fork_common(fork_info);
 }
 
 void ust_after_fork_child(ust_fork_info_t *fork_info)
 {
-       /* First sanitize the child */
+       /* Release urcu mutexes */
+       rcu_bp_after_fork_child();
+
+       /* Sanitize the child */
        ust_fork();
 
        /* Then release mutexes and reenable signals */
        ust_after_fork_common(fork_info);
-
-       /*
-        * Make sure we clean up the urcu-bp thread list in the child by running
-        * the garbage collection before any pthread_create can be called.
-        * Failure to do so could lead to a deadlock caused by reuse of a thread
-        * ID before urcu-bp garbage collection is performed.
-        */
-       synchronize_rcu();
 }
 
This page took 0.029814 seconds and 4 git commands to generate.