Author: gozer
Date: Thu Oct 25 01:10:37 2007
New Revision: 588160

URL: http://svn.apache.org/viewvc?rev=588160&view=rev
Log:
Merged revisions 584366-588158 via svnmerge from 
https://svn.apache.org/repos/asf/perl/modperl/trunk

........
  r584380 | gozer | 2007-10-12 23:48:14 -0700 (Fri, 12 Oct 2007) | 8 lines
  
  Don't increase the refcnt of the pnotes HV* twice, we
  will leak it.
  
  Submitted-By: Torsten Foertsch <[EMAIL PROTECTED]>
  Message-Id: <[EMAIL PROTECTED]>
  Reviewed-By: gozer
........
  r585724 | gozer | 2007-10-17 15:02:58 -0700 (Wed, 17 Oct 2007) | 7 lines
  
  Remove unused struct member from modperl_interp_pool_t
  
  Reviwed-By: gozer
  Submitted-By: Torsten Foertsch <[EMAIL PROTECTED]> 
  Message-Id: <[EMAIL PROTECTED]>
........
  r588156 | gozer | 2007-10-25 00:43:14 -0700 (Thu, 25 Oct 2007) | 12 lines
  
  PerlCleanupHandler are now registered with a subpool of $(r|c)->pool,
  instead of $(r|c)->pool itself, ensuring they run _before_ any other
  $(r|c)->pool cleanups.
  
  This way, pnotes can now be simply cleaned via a $(r|c)->pool cleanup,
  after any PerlCleanupHandler are run.
  
  Reviewed-By: gozer
  Submitted-By: Torsten Foertsch <[EMAIL PROTECTED]>
  Message-Id: <[EMAIL PROTECTED]>
........

Added:
    perl/modperl/branches/threading/t/modperl/pnotes2.t
      - copied unchanged from r588156, perl/modperl/trunk/t/modperl/pnotes2.t
    perl/modperl/branches/threading/t/response/TestModperl/pnotes2.pm
      - copied unchanged from r588156, 
perl/modperl/trunk/t/response/TestModperl/pnotes2.pm
Modified:
    perl/modperl/branches/threading/   (props changed)
    perl/modperl/branches/threading/Changes
    perl/modperl/branches/threading/src/modules/perl/modperl_config.c
    perl/modperl/branches/threading/src/modules/perl/modperl_config.h
    perl/modperl/branches/threading/src/modules/perl/modperl_types.h
    perl/modperl/branches/threading/src/modules/perl/modperl_util.c

Propchange: perl/modperl/branches/threading/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Thu Oct 25 01:10:37 2007
@@ -1 +1 @@
-/perl/modperl/trunk:1-584365
+/perl/modperl/trunk:1-588158

Modified: perl/modperl/branches/threading/Changes
URL: 
http://svn.apache.org/viewvc/perl/modperl/branches/threading/Changes?rev=588160&r1=588159&r2=588160&view=diff
==============================================================================
--- perl/modperl/branches/threading/Changes (original)
+++ perl/modperl/branches/threading/Changes Thu Oct 25 01:10:37 2007
@@ -14,7 +14,14 @@
 
 Expose modperl_interp_t via ModPerl::Interpreter [Torsten Foertsch]
 
-On Win32, embed the manifest file, if present, in mod_perl.so,
+PerlCleanupHandler are now registered with a subpool of $r->pool,
+instead of $r->pool itself, ensuring they run _before_ any other
+$r->pool cleanups [Torsten Foertsch]
+
+Fix a bug that would prevent pnotes from being cleaned up proprely
+at the end of the request [Torsten Foertsch]
+
+n Win32, embed the manifest file, if present, in mod_perl.so,
 so as to work with VC 8 [Steve Hay, Randy Kobes]
 
 Expose apr_thread_rwlock_t with the APR::ThreadRWLock module

Modified: perl/modperl/branches/threading/src/modules/perl/modperl_config.c
URL: 
http://svn.apache.org/viewvc/perl/modperl/branches/threading/src/modules/perl/modperl_config.c?rev=588160&r1=588159&r2=588160&view=diff
==============================================================================
--- perl/modperl/branches/threading/src/modules/perl/modperl_config.c (original)
+++ perl/modperl/branches/threading/src/modules/perl/modperl_config.c Thu Oct 
25 01:10:37 2007
@@ -362,11 +362,6 @@
 
     retval = modperl_callback_per_dir(MP_CLEANUP_HANDLER, r, MP_HOOK_RUN_ALL);
 
-    if (rcfg->pnotes) {
-        SvREFCNT_dec(rcfg->pnotes);
-        rcfg->pnotes = Nullhv;
-    }
-
     /* undo changes to %ENV caused by +SetupEnv, perl-script, or
      * $r->subprocess_env, so the values won't persist  */
     if (MpReqSETUP_ENV(rcfg)) {

Modified: perl/modperl/branches/threading/src/modules/perl/modperl_config.h
URL: 
http://svn.apache.org/viewvc/perl/modperl/branches/threading/src/modules/perl/modperl_config.h?rev=588160&r1=588159&r2=588160&view=diff
==============================================================================
--- perl/modperl/branches/threading/src/modules/perl/modperl_config.h (original)
+++ perl/modperl/branches/threading/src/modules/perl/modperl_config.h Thu Oct 
25 01:10:37 2007
@@ -42,9 +42,15 @@
 
 apr_status_t modperl_config_req_cleanup(void *data);
 
+/* use a subpool here to ensure that a PerlCleanupHandler is run before
+ * any other pool cleanup - suppools are destroyed first. Particularly a
+ * PerlCleanupHandler must run before request pnotes are dropped.
+ */
 #define modperl_config_req_cleanup_register(r, rcfg)           \
     if (r && !MpReqCLEANUP_REGISTERED(rcfg)) {                 \
-        apr_pool_cleanup_register(r->pool,                     \
+        apr_pool_t *p;                                        \
+        apr_pool_create(&p, r->pool);                         \
+        apr_pool_cleanup_register(p,                          \
                                   (void*)r,                    \
                                   modperl_config_req_cleanup,  \
                                   apr_pool_cleanup_null);      \

Modified: perl/modperl/branches/threading/src/modules/perl/modperl_types.h
URL: 
http://svn.apache.org/viewvc/perl/modperl/branches/threading/src/modules/perl/modperl_types.h?rev=588160&r1=588159&r2=588160&view=diff
==============================================================================
--- perl/modperl/branches/threading/src/modules/perl/modperl_types.h (original)
+++ perl/modperl/branches/threading/src/modules/perl/modperl_types.h Thu Oct 25 
01:10:37 2007
@@ -101,7 +101,6 @@
 struct modperl_interp_pool_t {
     server_rec *server;
     modperl_tipool_t *tipool;
-    modperl_tipool_config_t *tipool_cfg;
     modperl_interp_t *parent; /* from which to perl_clone() */
 };
 

Modified: perl/modperl/branches/threading/src/modules/perl/modperl_util.c
URL: 
http://svn.apache.org/viewvc/perl/modperl/branches/threading/src/modules/perl/modperl_util.c?rev=588160&r1=588159&r2=588160&view=diff
==============================================================================
--- perl/modperl/branches/threading/src/modules/perl/modperl_util.c (original)
+++ perl/modperl/branches/threading/src/modules/perl/modperl_util.c Thu Oct 25 
01:10:37 2007
@@ -856,33 +856,32 @@
     return APR_SUCCESS;   
 }
 
+MP_INLINE
+static void *modperl_pnotes_cleanup_data(pTHX_ HV **pnotes, apr_pool_t *p) {
+#ifdef USE_ITHREADS
+    modperl_cleanup_pnotes_data_t *cleanup_data = apr_palloc(p, 
sizeof(*cleanup_data));
+    cleanup_data->pnotes = pnotes;
+    cleanup_data->perl = aTHX;
+    return cleanup_data;
+#else
+    return pnotes;
+#endif
+}
+
 SV *modperl_pnotes(pTHX_ HV **pnotes, SV *key, SV *val, 
                    request_rec *r, conn_rec *c) {
     SV *retval = Nullsv;
 
     if (!*pnotes) {
-        *pnotes = newHV();
+       apr_pool_t *pool = r ? r->pool : c->pool;
+       void *cleanup_data;
+       *pnotes = newHV();
 
-        /* XXX: It would be nice to be able to do this with r->pnotes, but
-         * it's currently impossible, as 
modperl_config.c:modperl_config_request_cleanup()
-         * is responsible for running the CleanupHandlers, and it's cleanup 
callback is
-         * registered very early. If we register our cleanup here, we'll be 
running 
-         * *before* the CleanupHandlers, and they might still want to use 
pnotes...
-         */
-        if (c && !r) {
-            apr_pool_t *pool = r ? r->pool : c->pool;
-#ifdef USE_ITHREADS
-            modperl_cleanup_pnotes_data_t *cleanup_data = 
-                apr_palloc(pool, sizeof(*cleanup_data));
-            cleanup_data->pnotes = pnotes;
-            cleanup_data->perl = aTHX;
-#else
-            void *cleanup_data = pnotes;
-#endif
-            apr_pool_cleanup_register(pool, cleanup_data,
-                                      modperl_cleanup_pnotes,
-                                      apr_pool_cleanup_null);
-        }
+        cleanup_data = modperl_pnotes_cleanup_data(aTHX_ pnotes, pool);
+
+       apr_pool_cleanup_register(pool, cleanup_data,
+                                 modperl_cleanup_pnotes,
+                                 apr_pool_cleanup_null);
     }
 
     if (key) {
@@ -895,11 +894,9 @@
         else if (hv_exists(*pnotes, k, len)) {
             retval = *hv_fetch(*pnotes, k, len, FALSE);
         }
-    }
-    else {
-        retval = newRV_inc((SV *)*pnotes);
-    }
 
-    return retval ? SvREFCNT_inc(retval) : &PL_sv_undef;
+        return retval ? SvREFCNT_inc(retval) : &PL_sv_undef;
+    }
+    return newRV_inc((SV *)*pnotes);
 }
  


Reply via email to