[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)
commit03fe696d61d94bd59d878a9f81b0af85465d7e1e
treeb06c998eb73e3160972f9d9af7d516b86ab72a1f
parent7d6ecb1f6c7eabec011b66526161fcf678919c99
[perl #63886] 5.8.9 binary incompatibility with PL_perlio_mutex

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