On Wednesday 24 October 2007, Torsten Foertsch wrote: > On Thursday 18 October 2007, Philippe M. Chiasson wrote: > > Any chance you can break the patch into multiple patches > > This one ...
I forgot the changes in xs/maps and xs/tables. Torsten
Index: src/modules/perl/modperl_types.h
===================================================================
--- src/modules/perl/modperl_types.h (revision 7)
+++ src/modules/perl/modperl_types.h (revision 9)
@@ -246,6 +246,14 @@
typedef struct {
HV *pnotes;
+ apr_pool_t *pool;
+#ifdef USE_ITHREADS
+ modperl_interp_t *interp;
+#endif
+} modperl_pnotes_t;
+
+typedef struct {
+ modperl_pnotes_t pnotes;
SV *global_request_obj;
U8 flags;
int status;
@@ -253,13 +261,10 @@
MpAV *handlers_per_dir[MP_HANDLER_NUM_PER_DIR];
MpAV *handlers_per_srv[MP_HANDLER_NUM_PER_SRV];
modperl_perl_globals_t perl_globals;
-#ifdef USE_ITHREADS
- modperl_interp_t *interp;
-#endif
} modperl_config_req_t;
struct modperl_config_con_t {
- HV *pnotes;
+ modperl_pnotes_t pnotes;
#ifdef USE_ITHREADS
modperl_interp_t *interp;
#endif
Index: src/modules/perl/modperl_util.c
===================================================================
--- src/modules/perl/modperl_util.c (revision 7)
+++ src/modules/perl/modperl_util.c (revision 9)
@@ -829,49 +829,56 @@
return data ? *(int *)data : 0;
}
-#ifdef USE_ITHREADS
-typedef struct {
- HV **pnotes;
- PerlInterpreter *perl;
-} modperl_cleanup_pnotes_data_t;
-#endif
-
static MP_INLINE
apr_status_t modperl_cleanup_pnotes(void *data) {
- HV **pnotes = data;
+ modperl_pnotes_t *pnotes = data;
- if (*pnotes) {
+ ap_assert(pnotes);
#ifdef USE_ITHREADS
- modperl_cleanup_pnotes_data_t *cleanup_data = data;
- dTHXa(cleanup_data->perl);
- pnotes = cleanup_data->pnotes;
-#else
- pnotes = data;
+ {
+ dTHXa(pnotes->interp->perl);
#endif
- SvREFCNT_dec(*pnotes);
- *pnotes = Nullhv;
+ SvREFCNT_dec(pnotes->pnotes);
+ pnotes->pnotes = NULL;
+ pnotes->pool = NULL;
+#ifdef USE_ITHREADS
+ MP_TRACE_i(MP_FUNC, "DO: calling interp_unselect(0x%lx)\n",
+ pnotes->interp);
+ modperl_interp_unselect(pnotes->interp);
+ pnotes->interp = NULL;
}
+#endif
return APR_SUCCESS;
}
-SV *modperl_pnotes(pTHX_ HV **pnotes, SV *key, SV *val,
- request_rec *r, conn_rec *c) {
+void modperl_pnotes_kill(void *data) {
+ modperl_pnotes_t *pnotes = data;
+
+ ap_assert(pnotes);
+
+ if( !pnotes->pnotes ) return;
+
+ apr_pool_cleanup_kill(pnotes->pool, pnotes, modperl_cleanup_pnotes);
+ modperl_cleanup_pnotes(pnotes);
+}
+
+SV *modperl_pnotes(pTHX_ modperl_pnotes_t *pnotes, SV *key, SV *val,
+ apr_pool_t *pool) {
SV *retval = Nullsv;
- if (!*pnotes) {
- *pnotes = newHV();
-
- apr_pool_t *pool = r ? r->pool : c->pool;
+ if (!pnotes->pnotes) {
+ pnotes->pool=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;
+ pnotes->interp=MP_THX_INTERP_GET(aTHX);
+ pnotes->interp->refcnt++;
+ MP_TRACE_i(MP_FUNC, "TO: (0x%lx)->refcnt incremented to %ld\n",
+ pnotes->interp, pnotes->interp->refcnt);
#endif
- apr_pool_cleanup_register(pool, cleanup_data,
+
+ pnotes->pnotes=newHV();
+
+ apr_pool_cleanup_register(pool, pnotes,
modperl_cleanup_pnotes,
apr_pool_cleanup_null);
}
@@ -881,14 +888,14 @@
char *k = SvPV(key, len);
if (val) {
- retval = *hv_store(*pnotes, k, len, SvREFCNT_inc(val), 0);
+ retval = *hv_store(pnotes->pnotes, k, len, SvREFCNT_inc(val), 0);
}
- else if (hv_exists(*pnotes, k, len)) {
- retval = *hv_fetch(*pnotes, k, len, FALSE);
+ else if (hv_exists(pnotes->pnotes, k, len)) {
+ retval = *hv_fetch(pnotes->pnotes, k, len, FALSE);
}
return retval ? SvREFCNT_inc(retval) : &PL_sv_undef;
}
- return newRV_inc((SV *)*pnotes);
+ return newRV_inc((SV *)pnotes->pnotes);
}
Index: src/modules/perl/modperl_util.h
===================================================================
--- src/modules/perl/modperl_util.h (revision 7)
+++ src/modules/perl/modperl_util.h (revision 9)
@@ -134,7 +134,9 @@
void modperl_restart_count_inc(server_rec *base_server);
int modperl_restart_count(void);
-SV *modperl_pnotes(pTHX_ HV **pnotes, SV *key, SV *val,
- request_rec *r, conn_rec *c);
+void modperl_pnotes_kill(void *data);
+SV *modperl_pnotes(pTHX_ modperl_pnotes_t *pnotes, SV *key, SV *val,
+ apr_pool_t *pool );
+
#endif /* MODPERL_UTIL_H */
Index: xs/maps/modperl_functions.map
===================================================================
--- xs/maps/modperl_functions.map (revision 7)
+++ xs/maps/modperl_functions.map (revision 9)
@@ -30,6 +30,7 @@
mpxs_Apache2__RequestRec_location
mpxs_Apache2__RequestRec_as_string
mpxs_Apache2__RequestRec_pnotes | | r, key=Nullsv, val=Nullsv
+ mpxs_Apache2__RequestRec_pnotes_kill | | r
mpxs_Apache2__RequestRec_add_config | | r, lines, override=MP_HTTPD_OVERRIDE_HTACCESS, path=NULL, override_options=MP_HTTPD_OVERRIDE_OPTS_UNSET
mpxs_Apache2__RequestRec_document_root | | r, new_root=Nullsv
mpxs_Apache2__RequestRec_child_terminate
@@ -95,6 +96,7 @@
MODULE=Apache2::ConnectionUtil PACKAGE=guess
mpxs_Apache2__Connection_pnotes | | c, key=Nullsv, val=Nullsv
+ mpxs_Apache2__Connection_pnotes_kill | | c
MODULE=Apache2::Filter
modperl_filter_attributes | MPXS_ | ... | MODIFY_CODE_ATTRIBUTES
Index: xs/Apache2/RequestUtil/Apache2__RequestUtil.h
===================================================================
--- xs/Apache2/RequestUtil/Apache2__RequestUtil.h (revision 7)
+++ xs/Apache2/RequestUtil/Apache2__RequestUtil.h (revision 9)
@@ -218,9 +218,21 @@
return &PL_sv_undef;
}
- return modperl_pnotes(aTHX_ &rcfg->pnotes, key, val, r, NULL);
+ return modperl_pnotes(aTHX_ &rcfg->pnotes, key, val, r->pool);
}
+static MP_INLINE
+void mpxs_Apache2__RequestRec_pnotes_kill(pTHX_ request_rec *r)
+{
+ MP_dRCFG;
+
+ if (!rcfg) {
+ return;
+ }
+
+ modperl_pnotes_kill(&rcfg->pnotes);
+}
+
#define mpxs_Apache2__RequestRec_dir_config(r, key, sv_val) \
modperl_dir_config(aTHX_ r, r->server, key, sv_val)
Index: xs/Apache2/ConnectionUtil/Apache2__ConnectionUtil.h
===================================================================
--- xs/Apache2/ConnectionUtil/Apache2__ConnectionUtil.h (revision 7)
+++ xs/Apache2/ConnectionUtil/Apache2__ConnectionUtil.h (revision 9)
@@ -25,5 +25,19 @@
return &PL_sv_undef;
}
- return modperl_pnotes(aTHX_ &ccfg->pnotes, key, val, NULL, c);
+ return modperl_pnotes(aTHX_ &ccfg->pnotes, key, val, c->pool);
}
+
+static MP_INLINE
+void mpxs_Apache2__Connection_pnotes_kill(pTHX_ conn_rec *c)
+{
+ MP_dCCFG;
+
+ modperl_config_con_init(c, ccfg);
+
+ if (!ccfg) {
+ return;
+ }
+
+ modperl_pnotes_kill(&ccfg->pnotes);
+}
Index: xs/tables/current/ModPerl/FunctionTable.pm
===================================================================
--- xs/tables/current/ModPerl/FunctionTable.pm (revision 7)
+++ xs/tables/current/ModPerl/FunctionTable.pm (revision 9)
@@ -4446,9 +4446,19 @@
'type' => 'request_rec *',
'name' => 'r'
}
- ]
+ ]
},
{
+ 'return_type' => 'void',
+ 'name' => 'modperl_pnotes_kill',
+ 'args' => [
+ {
+ 'type' => 'void *',
+ 'name' => 'cl_data'
+ }
+ ]
+ },
+ {
'return_type' => 'int',
'name' => 'modperl_post_config_handler',
'args' => [
@@ -6265,6 +6275,20 @@
]
},
{
+ 'return_type' => 'void',
+ 'name' => 'mpxs_Apache2__Connection_pnotes_kill',
+ 'args' => [
+ {
+ 'type' => 'PerlInterpreter *',
+ 'name' => 'my_perl'
+ },
+ {
+ 'type' => 'conn_rec *',
+ 'name' => 'c'
+ }
+ ]
+ },
+ {
'return_type' => 'SV *',
'name' => 'mpxs_Apache2__Directive_as_hash',
'attr' => [
@@ -7072,6 +7096,20 @@
]
},
{
+ 'return_type' => 'void',
+ 'name' => 'mpxs_Apache2__RequestRec_pnotes_kill',
+ 'args' => [
+ {
+ 'type' => 'PerlInterpreter *',
+ 'name' => 'my_perl'
+ },
+ {
+ 'type' => 'request_rec *',
+ 'name' => 'r'
+ }
+ ]
+ },
+ {
'return_type' => 'SV *',
'name' => 'mpxs_Apache2__RequestRec_print',
'args' => [
signature.asc
Description: This is a digitally signed message part.
