After a fork(), the child process should execute synchronize_rcu() before any
new thread can be created. Failure to do so could lead to a deadlock in the
unlikely scenario where a thread ID appearing in the parent is reused in the
child before GC is performed.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
void ust_after_fork_parent(ust_fork_info_t *fork_info)
{
- /* Reenable signals */
+ /* Release mutexes and reenable signals */
ust_after_fork_common(fork_info);
}
/* First sanitize the child */
ust_fork();
- /* Then reenable interrupts */
+ /* 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();
}