From c254be07ec6b40dded57c0e5907b1bdfaf3d828d Mon Sep 17 00:00:00 2001 From: Steve Hay Date: Mon, 4 Dec 2006 14:31:08 +0000 Subject: [PATCH] Change #29424 may well be correct in itself, but currently doesn't work when perl is built with PERL_IMPLICIT_SYS because PERLIO_TERM uses PerlMemShared_free() which, in that case, involves the perlhost that has already been freed itself by perl_free(), which is called before PERL_SYS_TERM(). The order of perl_destruct(), perl_free(), PERL_SYS_TERM() cannot be changed (it is advertised in perlembed for a start), so just revert #29424 and the appropriate parts of #29442 for now. Perhaps PL_perlio_fd_refcnt needs allocating differently, or else the perlhost needs freeing later (after PerlIO)? p4raw-id: //depot/perl@29451 --- win32/perllib.c | 16 +++------------- win32/win32.c | 5 +++-- win32/wince.c | 5 +++-- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/win32/perllib.c b/win32/perllib.c index d1afa16..1e4ba09 100644 --- a/win32/perllib.c +++ b/win32/perllib.c @@ -248,28 +248,18 @@ RunPerl(int argc, char **argv, char **env) exitstatus = perl_run(my_perl); #endif } - + perl_destruct(my_perl); -#ifdef USE_ITHREADS - if (new_perl) { - PERL_SET_THX(new_perl); - perl_destruct(new_perl); - PERL_SET_THX(my_perl); - } -#endif - - PERL_SYS_TERM(); - perl_free(my_perl); - #ifdef USE_ITHREADS if (new_perl) { PERL_SET_THX(new_perl); + perl_destruct(new_perl); perl_free(new_perl); } #endif - + PERL_SYS_TERM(); return (exitstatus); } diff --git a/win32/win32.c b/win32/win32.c index a7c409f..d53741c 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -4902,10 +4902,11 @@ Perl_win32_init(int *argcp, char ***argvp) void Perl_win32_term(void) { - dTHX; HINTS_REFCNT_TERM; OP_REFCNT_TERM; - PERLIO_TERM; + /* Can't call PERLIO_TERM here because that calls PerlMemShared_free() + * but we're too late for that (at least when using PERL_IMPLICIT_SYS) + * since we've already done perl_free(). */ MALLOC_TERM; } diff --git a/win32/wince.c b/win32/wince.c index 846a33b..6e876a8 100644 --- a/win32/wince.c +++ b/win32/wince.c @@ -2660,10 +2660,11 @@ Perl_win32_init(int *argcp, char ***argvp) DllExport void Perl_win32_term(void) { - dTHX; HINTS_REFCNT_TERM; OP_REFCNT_TERM; - PERLIO_TERM; + /* Can't call PERLIO_TERM here because that calls PerlMemShared_free() + * but we're too late for that (at least when using PERL_IMPLICIT_SYS) + * since we've already done perl_free(). */ MALLOC_TERM; } -- 2.7.4