summaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
authorPatrik Hägglund <patrik.h.hagglund@ericsson.com>2013-02-02 20:21:05 +0100
committerKarl Williamson <public@khwilliamson.com>2013-03-21 12:11:18 -0600
commit4da80956418bbe1fdc23cad0b1cbb24cd7b87609 (patch)
tree732a95c492ad5d982fdc710b26bfbadf0b0ef3c4 /util.c
parentbe33f499c408bf256e1893d4bd68dd679a35eaac (diff)
downloadperl-4da80956418bbe1fdc23cad0b1cbb24cd7b87609.tar.gz
PATCH [perl #106212] Add PL_perlio_mutex to atfork_lock/unlock
Using threads + fork() on Linux, and IO operations in the threads, the PL_perlio_mutex may be left in a locked state at the call of fork(), potentially leading to deadlock in the child process at subsequent IO operations. (Threads are pre-empted and not continued in the child process after the fork.) Therefore, ensure that the PL_perlio_mutex is unlocked in the child process, right after fork(), by using atfork_lock/unlock. (The RT text gives ways to reproduce the problem, but are not easily added to Perl's test suite)
Diffstat (limited to 'util.c')
-rw-r--r--util.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/util.c b/util.c
index 5c695b8a6f..75381f1227 100644
--- a/util.c
+++ b/util.c
@@ -2798,6 +2798,9 @@ Perl_atfork_lock(void)
dVAR;
#if defined(USE_ITHREADS)
/* locks must be held in locking order (if any) */
+# ifdef USE_PERLIO
+ MUTEX_LOCK(&PL_perlio_mutex);
+# endif
# ifdef MYMALLOC
MUTEX_LOCK(&PL_malloc_mutex);
# endif
@@ -2812,6 +2815,9 @@ Perl_atfork_unlock(void)
dVAR;
#if defined(USE_ITHREADS)
/* locks must be released in same order as in atfork_lock() */
+# ifdef USE_PERLIO
+ MUTEX_UNLOCK(&PL_perlio_mutex);
+# endif
# ifdef MYMALLOC
MUTEX_UNLOCK(&PL_malloc_mutex);
# endif