New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
unlocking in forked child is fragile #13237
Comments
From @jmdhThis is a bug report for perl from dom@earth.li, As discussed at Flags: Site configuration information for perl 5.14.2: Configured by Debian Project at Fri Apr 12 09:56:36 UTC 2013. Summary of my perl5 (revision 5 version 14 subversion 2) configuration: Locally applied patches: @INC for perl 5.14.2: Environment for perl 5.14.2: |
From @jmdh0001-Reinit-mutex-after-a-fork.patchFrom ad6bd76bce15cf552e86a9648c357fe29233ec63 Mon Sep 17 00:00:00 2001
From: Niko Tyni <ntyni@debian.org>
Date: Sat, 10 Sep 2011 18:57:43 +0300
Subject: [PATCH] Reinit mutex after a fork()
First try at fixing a non-deterministical crash on Debian GNU/kFreeBSD with
perl -Mthreads -e 'threads->create(sub {})->detach; fork
Patch by Petr Salinger, <http://bugs.debian.org/628493>
---
embed.fnc | 1 +
embed.h | 2 ++
global.sym | 1 +
miniperlmain.c | 2 +-
proto.h | 1 +
util.c | 13 +++++++++++++
6 files changed, 19 insertions(+), 1 deletions(-)
diff --git a/embed.fnc b/embed.fnc
index 7e00e79..d89d139 100644
--- a/embed.fnc
+++ b/embed.fnc
@@ -726,6 +726,7 @@ Apr |void |my_failure_exit
Ap |I32 |my_fflush_all
Anp |Pid_t |my_fork
Anp |void |atfork_lock
+Anp |void |atfork_reinit
Anp |void |atfork_unlock
Ap |I32 |my_lstat
#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
diff --git a/embed.h b/embed.h
index 2b80af0..83cfa6f 100644
--- a/embed.h
+++ b/embed.h
@@ -560,6 +560,7 @@
#define my_fflush_all Perl_my_fflush_all
#define my_fork Perl_my_fork
#define atfork_lock Perl_atfork_lock
+#define atfork_reinit Perl_atfork_reinit
#define atfork_unlock Perl_atfork_unlock
#define my_lstat Perl_my_lstat
#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
@@ -2970,6 +2971,7 @@
#define my_fflush_all() Perl_my_fflush_all(aTHX)
#define my_fork Perl_my_fork
#define atfork_lock Perl_atfork_lock
+#define atfork_reinit Perl_atfork_reinit
#define atfork_unlock Perl_atfork_unlock
#define my_lstat() Perl_my_lstat(aTHX)
#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
diff --git a/global.sym b/global.sym
index 7788338..3567ee3 100644
--- a/global.sym
+++ b/global.sym
@@ -304,6 +304,7 @@ Perl_my_failure_exit
Perl_my_fflush_all
Perl_my_fork
Perl_atfork_lock
+Perl_atfork_reinit
Perl_atfork_unlock
Perl_my_lstat
Perl_my_memcmp
diff --git a/miniperlmain.c b/miniperlmain.c
index 39f8f19..7648eb3 100644
--- a/miniperlmain.c
+++ b/miniperlmain.c
@@ -101,7 +101,7 @@ main(int argc, char **argv, char **env)
* --GSAR 2001-07-20 */
PTHREAD_ATFORK(Perl_atfork_lock,
Perl_atfork_unlock,
- Perl_atfork_unlock);
+ Perl_atfork_reinit);
#endif
if (!PL_do_undump) {
diff --git a/proto.h b/proto.h
index 3306ab0..baab0d3 100644
--- a/proto.h
+++ b/proto.h
@@ -2034,6 +2034,7 @@ PERL_CALLCONV void Perl_my_failure_exit(pTHX)
PERL_CALLCONV I32 Perl_my_fflush_all(pTHX);
PERL_CALLCONV Pid_t Perl_my_fork(void);
PERL_CALLCONV void Perl_atfork_lock(void);
+PERL_CALLCONV void Perl_atfork_reinit(void);
PERL_CALLCONV void Perl_atfork_unlock(void);
PERL_CALLCONV I32 Perl_my_lstat(pTHX);
#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
diff --git a/util.c b/util.c
index 89fea23..f100237 100644
--- a/util.c
+++ b/util.c
@@ -2612,6 +2612,19 @@ Perl_atfork_unlock(void)
#endif
}
+void
+Perl_atfork_reinit(void)
+{
+ dVAR;
+#if defined(USE_ITHREADS)
+ /* locks must be released in same order as in atfork_lock() */
+# ifdef MYMALLOC
+ MUTEX_INIT(&PL_malloc_mutex);
+# endif
+ OP_REFCNT_INIT;
+#endif
+}
+
Pid_t
Perl_my_fork(void)
{
--
1.7.5.4
|
From @LeontOn Sat, Sep 7, 2013 at 8:17 PM, Dominic Hargreaves <
Can't say I like the patch. POSIX seems to confirm my gut feeling: I really think this was a bug in kFreeBSD, and given that it has apparently Leon |
The RT System itself - Status changed from 'new' to 'open' |
Migrated from rt.perl.org#119663 (status was 'open')
Searchable as RT119663$
The text was updated successfully, but these errors were encountered: