From: Nick Ing-Simmons Date: Thu, 2 May 2002 07:54:51 +0000 (+0000) Subject: Fix the "PerlIO require leak". Snag was that clean_objs X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=9f4bd2225c152364d8589911c4c769edae165d9b;p=p5sagit%2Fp5-mst-13.2.git Fix the "PerlIO require leak". Snag was that clean_objs autoloaded DESTROY (needing IO) after known layers had been freed. Postpone layer list free to PerlIO_cleanup, rather than PerlIO_destruct. Tweak sequence in perl_destruct so that sv_undef is immortal till layer list is done with it. p4raw-id: //depot/perlio@16335 --- diff --git a/perl.c b/perl.c index 7b6eb62..7164d55 100644 --- a/perl.c +++ b/perl.c @@ -431,7 +431,7 @@ perl_destruct(pTHXx) FREETMPS; /* Need to flush since END blocks can produce output */ - PerlIO_flush((PerlIO*)NULL); + PerlIO_flush((PerlIO*)NULL); if (CALL_FPTR(PL_threadhook)(aTHX)) { /* Threads hook has vetoed further cleanup */ @@ -825,9 +825,6 @@ perl_destruct(pTHXx) SvANY(&PL_sv_no) = NULL; SvFLAGS(&PL_sv_no) = 0; - SvREFCNT(&PL_sv_undef) = 0; - SvREADONLY_off(&PL_sv_undef); - { int i; for (i=0; i<=2; i++) { @@ -846,6 +843,13 @@ perl_destruct(pTHXx) PerlIO_cleanup(aTHX); #endif + /* sv_undef needs to stay immortal until after PerlIO_cleanup + as currently layers use it rather than Nullsv as a marker + for no arg - and will try and SvREFCNT_dec it. + */ + SvREFCNT(&PL_sv_undef) = 0; + SvREADONLY_off(&PL_sv_undef); + Safefree(PL_origfilename); Safefree(PL_reg_start_tmp); if (PL_reg_curpm) diff --git a/perlio.c b/perlio.c index ac35527..e80c1f0 100644 --- a/perlio.c +++ b/perlio.c @@ -601,10 +601,6 @@ PerlIO_destruct(pTHX) f++; } } - PerlIO_list_free(aTHX_ PL_known_layers); - PL_known_layers = NULL; - PerlIO_list_free(aTHX_ PL_def_layerlist); - PL_def_layerlist = NULL; } void @@ -2071,7 +2067,9 @@ PerlIO_cleanup(pTHX) { int i; #ifdef USE_ITHREADS - PerlIO_debug("Cleanup %p\n",aTHX); + PerlIO_debug("Cleanup layers for %p\n",aTHX); +#else + PerlIO_debug("Cleanup layers\n"); #endif /* Raise STDIN..STDERR refcount so we don't close them */ for (i=0; i < 3; i++) @@ -2080,6 +2078,15 @@ PerlIO_cleanup(pTHX) /* Restore STDIN..STDERR refcount */ for (i=0; i < 3; i++) PerlIOUnix_refcnt_dec(i); + + if (PL_known_layers) { + PerlIO_list_free(aTHX_ PL_known_layers); + PL_known_layers = NULL; + } + if(PL_def_layerlist) { + PerlIO_list_free(aTHX_ PL_def_layerlist); + PL_def_layerlist = NULL; + } }