From: Rafael Garcia-Suarez Date: Fri, 20 Oct 2006 10:20:18 +0000 (+0000) Subject: More leak fixes, by Jarkko X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=6cb8cb214e85c7d67c2acca4f12551f90bf4908e;p=p5sagit%2Fp5-mst-13.2.git More leak fixes, by Jarkko p4raw-id: //depot/perl@29060 --- diff --git a/dosish.h b/dosish.h index 0667b54..a5eeace 100644 --- a/dosish.h +++ b/dosish.h @@ -43,7 +43,11 @@ #endif /* DJGPP */ #ifndef PERL_SYS_TERM +# ifdef USE_PERLIO +# define PERL_SYS_TERM() HINTS_REFCNT_TERM; OP_REFCNT_TERM; PERLIO_TERM; MALLOC_TERM +# else # define PERL_SYS_TERM() HINTS_REFCNT_TERM; OP_REFCNT_TERM; MALLOC_TERM +# endif #endif #define dXSUB_SYS diff --git a/perl.h b/perl.h index be6dfca..bb6437d 100644 --- a/perl.h +++ b/perl.h @@ -3863,6 +3863,21 @@ typedef Sighandler_t Sigsave_t; # define RUNOPS_DEFAULT Perl_runops_standard #endif +#ifdef USE_PERLIO +void PerlIO_teardown(pTHX); +# ifdef USE_THREADS +# define PERLIO_INIT MUTEX_INIT(&PL_perlio_mutex) +# define PERLIO_TERM \ + STMT_START { \ + PerlIO_teardown(aTHX); \ + MUTEX_DESTROY(&PL_perlio_mutex);\ + } STMT_END +# else +# define PERLIO_INIT +# define PERLIO_TERM PerlIO_teardown(aTHX) +# endif +#endif + #ifdef MYMALLOC # ifdef MUTEX_INIT_CALLS_MALLOC # define MALLOC_INIT \ diff --git a/perlio.c b/perlio.c index 6434a9b..dbe1108 100644 --- a/perlio.c +++ b/perlio.c @@ -2253,13 +2253,9 @@ PerlIOBase_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags) return f; } -#ifdef USE_THREADS -perl_mutex PerlIO_mutex; -#endif - /* PL_perlio_fd_refcnt[] is in intrpvar.h */ -/* Must be called with PerlIO_mutex locked. */ +/* Must be called with PL_perlio_mutex locked (if under 5.005 threads). */ static void S_more_refcounted_fds(pTHX_ const int new_fd) { dVAR; @@ -2281,7 +2277,7 @@ S_more_refcounted_fds(pTHX_ const int new_fd) { if (!new_array) { #ifdef USE_THREADS - MUTEX_UNLOCK(&PerlIO_mutex); + MUTEX_UNLOCK(&PL_perlio_mutex); #endif /* Can't use PerlIO to write as it allocates memory */ PerlLIO_write(PerlIO_fileno(Perl_error_log), @@ -2305,7 +2301,7 @@ PerlIO_init(pTHX) { /* Place holder for stdstreams call ??? */ #ifdef USE_THREADS - MUTEX_INIT(&PerlIO_mutex); + MUTEX_INIT(&PL_perlio_mutex); #else PERL_UNUSED_CONTEXT; #endif @@ -2319,7 +2315,7 @@ PerlIOUnix_refcnt_inc(int fd) dVAR; #ifdef USE_THREADS - MUTEX_LOCK(&PerlIO_mutex); + MUTEX_LOCK(&PL_perlio_mutex); #endif if (fd >= PL_perlio_fd_refcnt_size) S_more_refcounted_fds(aTHX_ fd); @@ -2328,7 +2324,7 @@ PerlIOUnix_refcnt_inc(int fd) PerlIO_debug("fd %d refcnt=%d\n",fd,PL_perlio_fd_refcnt[fd]); #ifdef USE_THREADS - MUTEX_UNLOCK(&PerlIO_mutex); + MUTEX_UNLOCK(&PL_perlio_mutex); #endif } } @@ -2341,7 +2337,7 @@ PerlIOUnix_refcnt_dec(int fd) if (fd >= 0) { dVAR; #ifdef USE_THREADS - MUTEX_LOCK(&PerlIO_mutex); + MUTEX_LOCK(&PL_perlio_mutex); #endif /* XXX should this be a panic? */ if (fd >= PL_perlio_fd_refcnt_size) @@ -2351,7 +2347,7 @@ PerlIOUnix_refcnt_dec(int fd) cnt = --PL_perlio_fd_refcnt[fd]; PerlIO_debug("fd %d refcnt=%d\n",fd,cnt); #ifdef USE_THREADS - MUTEX_UNLOCK(&PerlIO_mutex); + MUTEX_UNLOCK(&PL_perlio_mutex); #endif } return cnt; @@ -2368,19 +2364,6 @@ PerlIO_cleanup(pTHX) PerlIO_debug("Cleanup layers\n"); #endif -#ifdef DEBUGGING - { - /* By now all filehandles should have been closed, so any - * stray (non-STD-)filehandles indicate *possible* (PerlIO) - * errors. */ - for (i = 3; i < PL_perlio_fd_refcnt_size; i++) { - if (PL_perlio_fd_refcnt[i]) - PerlIO_debug("PerlIO_cleanup: fd %d refcnt=%d\n", - i, PL_perlio_fd_refcnt[i]); - } - } -#endif - /* Raise STDIN..STDERR refcount so we don't close them */ for (i=0; i < 3; i++) PerlIOUnix_refcnt_inc(i); @@ -2397,8 +2380,25 @@ PerlIO_cleanup(pTHX) PerlIO_list_free(aTHX_ PL_def_layerlist); PL_def_layerlist = NULL; } +} + +void PerlIO_teardown(pTHX) /* Call only from PERL_SYS_TERM(). */ +{ +#ifdef DEBUGGING + { + /* By now all filehandles should have been closed, so any + * stray (non-STD-)filehandles indicate *possible* (PerlIO) + * errors. */ + int i; + for (i = 3; i < PL_perlio_fd_refcnt_size; i++) { + if (PL_perlio_fd_refcnt[i]) + PerlIO_debug("PerlIO_cleanup: fd %d refcnt=%d\n", + i, PL_perlio_fd_refcnt[i]); + } + } +#endif #ifdef USE_THREADS - MUTEX_UNLOCK(&PerlIO_mutex); + MUTEX_LOCK(&PL_perlio_mutex); #endif if (PL_perlio_fd_refcnt_size /* Assuming initial size of zero. */ && PL_perlio_fd_refcnt) { @@ -2410,13 +2410,13 @@ PerlIO_cleanup(pTHX) if (header->interpreter == aTHX) #endif { - Safefree(PL_perlio_fd_refcnt); + PerlMemShared_free(PL_perlio_fd_refcnt); /* Not Safefree() because was allocated with PerlMemShared_realloc(). */ PL_perlio_fd_refcnt = NULL; PL_perlio_fd_refcnt_size = 0; } } #ifdef USE_THREADS - MUTEX_UNLOCK(&PerlIO_mutex); + MUTEX_UNLOCK(&PL_perlio_mutex); #endif } diff --git a/perliol.h b/perliol.h index c6da2b6..f062225 100644 --- a/perliol.h +++ b/perliol.h @@ -167,6 +167,7 @@ PERL_EXPORT_C PerlIO_list_t *PerlIO_clone_list(pTHX_ PerlIO_list_t *proto, CLONE PERL_EXPORT_C void PerlIO_list_free(pTHX_ PerlIO_list_t *list); PERL_EXPORT_C void PerlIO_list_push(pTHX_ PerlIO_list_t *list, PerlIO_funcs *funcs, SV *arg); PERL_EXPORT_C void PerlIO_list_free(pTHX_ PerlIO_list_t *list); +PERL_EXPORT_C void PerlIO_teardown(pTHX); /*--------------------------------------------------------------------------------------*/ /* Generic, or stub layer functions */ diff --git a/perlvars.h b/perlvars.h index b4f3e51..c8706f5 100644 --- a/perlvars.h +++ b/perlvars.h @@ -138,3 +138,7 @@ PERLVARI(Gmy_cxt_index, int, 0) #if defined(USE_ITHREADS) PERLVAR(Ghints_mutex, perl_mutex) /* Mutex for refcounted he refcounting */ #endif + +#if defined(USE_THREADS) /* Yes, 5.005 threads - should be removed. */ +PERLVAR(Gperlio_mutex, perl_mutex) /* Mutex for perlio fd refcounts */ +#endif diff --git a/unixish.h b/unixish.h index 631a619..a08e8ba 100644 --- a/unixish.h +++ b/unixish.h @@ -131,7 +131,11 @@ #endif #ifndef PERL_SYS_TERM -#define PERL_SYS_TERM() HINTS_REFCNT_TERM; OP_REFCNT_TERM; MALLOC_TERM +# ifdef USE_PERLIO +# define PERL_SYS_TERM() HINTS_REFCNT_TERM; OP_REFCNT_TERM; PERLIO_TERM; MALLOC_TERM +# else +# define PERL_SYS_TERM() HINTS_REFCNT_TERM; OP_REFCNT_TERM; MALLOC_TERM +# endif #endif #define BIT_BUCKET "/dev/null"