[perl #63886] 5.8.9 binary incompatibility with PL_perlio_mutex
authorFrom: Edward Moy <emoy@apple.com>
Mon, 9 Jul 2012 06:01:23 +0000 (23:01 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 9 Jul 2012 06:01:23 +0000 (23:01 -0700)
On Mac OS X, the Modo application by Luxology, is a 3-D rendering program
that uses embedded perl.  It works fine with perl 5.8.6 and 5.8.8, but with
5.8.9, certain operations either cause the app to crash or exit while in
the perl interpreter.  I have tracked this down to the PL_perlio_mutex
variable not being initialized.

What I believe was the cause is the change to PERL_SYS_INIT3 (and
PERL_SYS_INIT) to be defined as a function call (Perl_sys_init3() or
Perl_sys_init(), respectively).  With this change Perl_sys_init3() and
Perl_sys_init() now call MUTEX_INIT(&PL_perlio_mutex) (via the PERLIO_INIT
macro), instead of the function PerlIO_init() doing the initialization.

However, for embedded code compiled before 5.8.9, PERL_SYS_INIT3
was a macro that defined the initialization directly (no call to
Perl_sys_init3(), which didn't exist), but without PERLIO_INIT, which
wasn't defined before 5.8.9.  Since PerlIO_init() now doesn't initialize
either, PL_perlio_mutex is left uninitialized, and this causes the crash
and premature exit noted above.

The workaround is to reinstate the PL_perlio_mutex initialization in
PerlIO_init(), but this means that MUTEX_INIT(&PL_perlio_mutex) may be
called twice in some cases.  However, the crash/exit is avoided.  Here is
the patch I used:

perlio.c

index 7c5b76a..b54b9b1 100644 (file)
--- a/perlio.c
+++ b/perlio.c
@@ -2323,6 +2323,12 @@ PerlIO_init(pTHX)
 {
     /* MUTEX_INIT(&PL_perlio_mutex) is done in PERL_SYS_INIT3(). */
     PERL_UNUSED_CONTEXT;
+    /*
+     * No, for backwards compatibility (before PERL_SYS_INIT3 changed to be
+     * defined as a separate function call), we need to call
+     * MUTEX_INIT(&PL_perlio_mutex) (via the PERLIO_INIT macro).
+     */
+    PERLIO_INIT;
 }
 
 void