dougm 00/04/15 10:51:45 Modified: lib/ModPerl Code.pm src/modules/perl modperl_interp.c modperl_interp.h Log: move interpreter teardown into modperl_interp_destroy provide modperl_interp_cleanup to assist with throttling Revision Changes Path 1.6 +4 -2 modperl-2.0/lib/ModPerl/Code.pm Index: Code.pm =================================================================== RCS file: /home/cvs/modperl-2.0/lib/ModPerl/Code.pm,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- Code.pm 2000/04/15 01:43:17 1.5 +++ Code.pm 2000/04/15 17:51:44 1.6 @@ -69,7 +69,8 @@ my %flags = ( Srv => [qw(NONE PERL_TAINT_CHECK PERL_WARN FRESH_RESTART)], Dir => [qw(NONE INCPUSH SENDHDR SENTHDR ENV CLEANUP RCLEANUP)], - Interp => [qw(NONE IN_USE PUTBACK)], + Interp => [qw(NONE IN_USE PUTBACK CLONED)], + Handler => [qw(NONE METHOD)], ); sub new { @@ -271,8 +272,9 @@ generate_trace => {h => 'modperl_trace.h'}, ); +my @c_src_names = qw(interp log); my @g_c_names = map { "modperl_$_" } qw(hooks directives); -my @c_names = (qw(mod_perl modperl_interp modperl_log), @g_c_names); +my @c_names = ('mod_perl', (map "modperl_$_", @c_src_names), @g_c_names); sub c_files { map { "$_.c" } @c_names } sub o_files { map { "$_.o" } @c_names } 1.3 +26 -14 modperl-2.0/src/modules/perl/modperl_interp.c Index: modperl_interp.c =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_interp.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- modperl_interp.c 2000/04/15 01:38:45 1.2 +++ modperl_interp.c 2000/04/15 17:51:44 1.3 @@ -20,6 +20,29 @@ return interp; } +void modperl_interp_destroy(modperl_interp_t *interp) +{ + dTHXa(interp->perl); + + MP_TRACE_i(MP_FUNC, "interp == 0x%lx\n", + (unsigned long)interp); + + if (MpInterpIN_USE(interp)) { + MP_TRACE_i(MP_FUNC, "*error - still in use!*\n"); + } + + + PL_perl_destruct_level = 2; + perl_destruct(interp->perl); + perl_free(interp->perl); +} + +ap_status_t modperl_interp_cleanup(void *data) +{ + modperl_interp_destroy((modperl_interp_t *)data); + return APR_SUCCESS; +} + modperl_interp_t *modperl_interp_get(server_rec *s) { MP_dSCFG(s); @@ -82,18 +105,7 @@ modperl_interp_pool_t *mip = (modperl_interp_pool_t *)data; while (mip->head) { - dTHXa(mip->head->perl); - - MP_TRACE_i(MP_FUNC, "head == 0x%lx\n", - (unsigned long)mip->head); - if (MpInterpIN_USE(mip->head)) { - MP_TRACE_i(MP_FUNC, "*error - still in use!*\n"); - } - - PL_perl_destruct_level = 2; - perl_destruct(mip->head->perl); - perl_free(mip->head->perl); - + modperl_interp_destroy(mip->head); mip->head->perl = NULL; mip->head = mip->head->next; } @@ -101,8 +113,7 @@ MP_TRACE_i(MP_FUNC, "parent == 0x%lx\n", (unsigned long)mip->parent); - perl_destruct(mip->parent->perl); - perl_free(mip->parent->perl); + modperl_interp_destroy(mip->parent); mip->parent->perl = NULL; ap_destroy_lock(mip->mip_lock); @@ -136,6 +147,7 @@ for (i=0; i<mip->start; i++) { modperl_interp_t *interp = modperl_interp_new(p, mip->parent); interp->perl = perl_clone(perl, TRUE); + MpInterpCLONED_On(interp); if (cur_interp) { cur_interp->next = interp; 1.2 +4 -0 modperl-2.0/src/modules/perl/modperl_interp.h Index: modperl_interp.h =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_interp.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- modperl_interp.h 2000/04/14 23:51:58 1.1 +++ modperl_interp.h 2000/04/15 17:51:44 1.2 @@ -4,6 +4,10 @@ modperl_interp_t *modperl_interp_new(ap_pool_t *p, modperl_interp_t *parent); +void modperl_interp_destroy(modperl_interp_t *interp); + +ap_status_t modperl_interp_cleanup(void *data); + modperl_interp_t *modperl_interp_get(server_rec *s); void modperl_interp_pool_init(server_rec *s, ap_pool_t *p,