Change #29424 may well be correct in itself, but currently doesn't
Steve Hay [Mon, 4 Dec 2006 14:31:08 +0000 (14:31 +0000)]
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
win32/win32.c
win32/wince.c

index d1afa16..1e4ba09 100644 (file)
@@ -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);
 }
index a7c409f..d53741c 100644 (file)
@@ -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;
 }
 
index 846a33b..6e876a8 100644 (file)
@@ -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;
 }