projects
/
lttng-ust.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: liblttng-ust-fork deadlock
[lttng-ust.git]
/
liblttng-ust
/
lttng-ust-comm.c
diff --git
a/liblttng-ust/lttng-ust-comm.c
b/liblttng-ust/lttng-ust-comm.c
index 5e738b06cf6eee5b539f4f507ba97817525a8fbf..8c864f8ce595621434cfac4a08dec1aa705d5671 100644
(file)
--- 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 };
*/
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.
*/
/*
* 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.
*/
* If the open failed because the file did not exist, try
* creating it ourself.
*/
+ lttng_ust_nest_count++;
pid = fork();
pid = fork();
+ lttng_ust_nest_count--;
if (pid > 0) {
int status;
if (pid > 0) {
int status;
@@
-1019,6
+1027,8
@@
void ust_before_fork(sigset_t *save_sigset)
sigset_t all_sigs;
int ret;
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);
/* Disable signals */
sigfillset(&all_sigs);
ret = sigprocmask(SIG_BLOCK, &all_sigs, save_sigset);
@@
-1044,6
+1054,8
@@
static void ust_after_fork_common(sigset_t *restore_sigset)
void ust_after_fork_parent(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 */
DBG("process %d", getpid());
rcu_bp_after_fork_parent();
/* Release mutexes and reenable signals */
@@
-1061,6
+1073,8
@@
void ust_after_fork_parent(sigset_t *restore_sigset)
*/
void ust_after_fork_child(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();
DBG("process %d", getpid());
/* Release urcu mutexes */
rcu_bp_after_fork_child();
This page took
0.024214 seconds
and
4
git commands to generate.