From: Jarkko Hietaniemi <jhi@iki.fi>
Date: Tue, 5 Dec 2006 16:08:33 +0000 (-0500)
Subject: Re: When should PERL_SYS_TERM() be called? [was: Re: [PATCH] Re: [PATCH] Re: [PATCH... 
X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=eae082a0f03d579c4d57624c9d7432c4e6eb6e82;p=p5sagit%2Fp5-mst-13.2.git

Re: When should PERL_SYS_TERM() be called? [was: Re: [PATCH] Re: [PATCH] Re: [PATCH] abstract mempool header testing]
Message-ID: <4575DFD1.1060108@iki.fi>

Fixes a problem spotted by Jan Dubois:

The PerlMemShared pool is only shared between the interpreters that
can share data structures (interpreters created by perl_clone(), which
mean pseudo-fork, and threads.xs).  The pool is not shared between
interpreters that are created separately by perl_alloc().
[...]
I guess this means PL_perlio_fd_refcnt needs to be allocated and
freed by standard malloc() and not go through any abstraction.

p4raw-id: //depot/perl@29477
---

diff --git a/perlio.c b/perlio.c
index 0d91fb4..0d4231c 100644
--- a/perlio.c
+++ b/perlio.c
@@ -2278,8 +2278,9 @@ S_more_refcounted_fds(pTHX_ const int new_fd) {
 
     assert (new_max > new_fd);
 
-    new_array =
-	(int*) PerlMemShared_realloc(PL_perlio_fd_refcnt, new_max * sizeof(int));
+    /* Use plain realloc() since we need this memory to be really
+     * global and visible to all the interpreters and/or threads. */
+    new_array = (int*) realloc(PL_perlio_fd_refcnt, new_max * sizeof(int));
 
     if (!new_array) {
 #ifdef USE_ITHREADS
@@ -2412,19 +2413,14 @@ void PerlIO_teardown(pTHX) /* Call only from PERL_SYS_TERM(). */
 	}
     }
 #endif
-#if !defined(WIN32) || !defined(PERL_IMPLICIT_SYS)
-    /* On Windows, under PERL_IMPLICIT_SYS, all memory allocated by
-     * PerlMemShared_...() will be freed anyways when PL_curinterp
-     * is being destroyed. */
+    /* Not bothering with PL_perlio_mutex since by now
+     * all the interpreters are gone. */
     if (PL_perlio_fd_refcnt_size /* Assuming initial size of zero. */
         && PL_perlio_fd_refcnt) {
-	/* Not bothering with PL_perlio_mutex since by now all the
-	 * interpreters are gone. */
-	PerlMemShared_free(PL_perlio_fd_refcnt);
+	free(PL_perlio_fd_refcnt); /* To match realloc() in S_more_refcounted_fds(). */
 	PL_perlio_fd_refcnt = NULL;
 	PL_perlio_fd_refcnt_size = 0;
     }
-#endif
 }