You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl-cvs@perl.apache.org by do...@apache.org on 2001/04/10 01:57:23 UTC

cvs commit: modperl-2.0/src/modules/perl mod_perl.c modperl_interp.c modperl_interp.h modperl_types.h modperl_util.c modperl_util.h

dougm       01/04/09 16:57:23

  Modified:    src/modules/perl mod_perl.c modperl_interp.c
                        modperl_interp.h modperl_types.h modperl_util.c
                        modperl_util.h
  Log:
  implement "the dso fix" 2.0 style
  
  Revision  Changes    Path
  1.43      +15 -2     modperl-2.0/src/modules/perl/mod_perl.c
  
  Index: mod_perl.c
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/mod_perl.c,v
  retrieving revision 1.42
  retrieving revision 1.43
  diff -u -r1.42 -r1.43
  --- mod_perl.c	2001/04/06 02:18:15	1.42
  +++ mod_perl.c	2001/04/09 23:57:22	1.43
  @@ -3,12 +3,21 @@
   #ifndef USE_ITHREADS
   static apr_status_t modperl_shutdown(void *data)
   {
  -    PerlInterpreter *perl = (PerlInterpreter *)data;
  +    modperl_cleanup_data_t *cdata = (modperl_cleanup_data_t *)data;
  +    PerlInterpreter *perl = (PerlInterpreter *)cdata->data;
  +    apr_array_header_t *handles;
  +
       PL_perl_destruct_level = 2;
       MP_TRACE_i(MP_FUNC, "destroying interpreter=0x%lx\n",
                  (unsigned long)perl);
  +
       perl_destruct(perl);
       perl_free(perl);
  +
  +    if ((handles = modperl_xs_dl_handles_get(cdata->pool)) {
  +        modperl_xs_dl_handles_close(handles);
  +    }
  +
       return APR_SUCCESS;
   }
   #endif
  @@ -20,6 +29,9 @@
       int status;
       char **argv;
       int argc;
  +#ifndef USE_ITHREADS
  +    modperl_cleanup_data_t *cdata;
  +#endif
   
   #ifdef MP_USE_GTOP
       MP_TRACE_m_do(
  @@ -61,7 +73,8 @@
   #endif
   
   #ifndef USE_ITHREADS
  -    apr_pool_cleanup_register(p, (void*)perl,
  +    cdata = modperl_cleanup_data_new(p, (void*)perl);
  +    apr_pool_cleanup_register(p, cdata,
                                 modperl_shutdown, apr_pool_cleanup_null);
   #endif
       
  
  
  
  1.31      +37 -8     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.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- modperl_interp.c	2001/04/06 02:18:15	1.30
  +++ modperl_interp.c	2001/04/09 23:57:22	1.31
  @@ -16,6 +16,25 @@
       return MP_interp_scope_desc[scope];
   }
   
  +void modperl_interp_clone_init(modperl_interp_t *interp)
  +{
  +    dTHXa(interp->perl);
  +
  +    MpInterpCLONED_On(interp);
  +
  +    PERL_SET_CONTEXT(aTHX);
  +
  +    /* XXX: hack for bug fixed in 5.6.1 */
  +    if (PL_scopestack_ix == 0) {
  +        ENTER;
  +    }
  +
  +    /* clear @DynaLoader::dl_librefs so we only dlclose() those
  +     * which are opened by the clone
  +     */
  +    modperl_xs_dl_handles_clear(aTHX);
  +}
  +
   modperl_interp_t *modperl_interp_new(apr_pool_t *p,
                                        modperl_interp_pool_t *mip,
                                        PerlInterpreter *perl)
  @@ -35,15 +54,8 @@
   
           interp->perl = perl_clone(perl, FALSE);
   
  -        {
  -            /* XXX: hack for bug fixed in 5.6.1 */
  -            dTHXa(interp->perl);
  -            if (PL_scopestack_ix == 0) {
  -                ENTER;
  -            }
  -        }
  +        modperl_interp_clone_init(interp);
   
  -        MpInterpCLONED_On(interp);
           PERL_SET_CONTEXT(mip->parent->perl);
   
   #ifdef MP_USE_GTOP
  @@ -60,6 +72,8 @@
   
   void modperl_interp_destroy(modperl_interp_t *interp)
   {
  +    apr_pool_t *p = NULL;
  +    apr_array_header_t *handles;
       dTHXa(interp->perl);
   
       MP_TRACE_i(MP_FUNC, "interp == 0x%lx\n",
  @@ -71,8 +85,23 @@
   
       PERL_SET_CONTEXT(interp->perl);
       PL_perl_destruct_level = 2;
  +
  +    /* we cant use interp->mip->ap_pool without locking
  +     * apr_pool_create() will mutex lock for us
  +     * XXX: could roll something without using apr_pool_t
  +     * to avoid locking
  +     */
  +    (void)apr_pool_create(&p, NULL);
  +    handles = modperl_xs_dl_handles_get(aTHX_ p);
  +
       perl_destruct(interp->perl);
       perl_free(interp->perl);
  +
  +    if (handles) {
  +        modperl_xs_dl_handles_close(handles);
  +    }
  +
  +    apr_pool_destroy(p);
   }
   
   apr_status_t modperl_interp_cleanup(void *data)
  
  
  
  1.11      +2 -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.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- modperl_interp.h	2001/04/06 02:18:15	1.10
  +++ modperl_interp.h	2001/04/09 23:57:22	1.11
  @@ -9,6 +9,8 @@
   #ifdef USE_ITHREADS
   const char *modperl_interp_scope_desc(modperl_interp_scope_e scope);
   
  +void modperl_interp_clone_init(modperl_interp_t *interp);
  +
   modperl_interp_t *modperl_interp_new(apr_pool_t *p,
                                        modperl_interp_pool_t *mip,
                                        PerlInterpreter *perl);
  
  
  
  1.34      +5 -0      modperl-2.0/src/modules/perl/modperl_types.h
  
  Index: modperl_types.h
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_types.h,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- modperl_types.h	2001/04/06 02:18:15	1.33
  +++ modperl_types.h	2001/04/09 23:57:22	1.34
  @@ -205,4 +205,9 @@
       MpAV *handlers_connection[MP_HANDLER_NUM_CONNECTION];
   } modperl_config_con_t;
   
  +typedef struct {
  +    apr_pool_t *pool;
  +    void *data;
  +} modperl_cleanup_data_t;
  +
   #endif /* MODPERL_TYPES_H */
  
  
  
  1.6       +78 -0     modperl-2.0/src/modules/perl/modperl_util.c
  
  Index: modperl_util.c
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_util.c,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- modperl_util.c	2001/03/14 04:22:51	1.5
  +++ modperl_util.c	2001/04/09 23:57:22	1.6
  @@ -86,3 +86,81 @@
   {
       return apr_psprintf(p, "%s:%u", s->server_hostname, s->port);
   }
  +
  +#define dl_librefs "DynaLoader::dl_librefs"
  +#define dl_modules "DynaLoader::dl_modules"
  +
  +void modperl_xs_dl_handles_clear(pTHXo)
  +{
  +    AV *librefs = get_av(dl_librefs, FALSE);
  +    if (librefs) {
  +        av_clear(librefs);
  +    }
  +}
  +
  +apr_array_header_t *modperl_xs_dl_handles_get(pTHX_ apr_pool_t *p)
  +{
  +    I32 i;
  +    AV *librefs = get_av(dl_librefs, FALSE);
  +    AV *modules = get_av(dl_modules, FALSE);
  +    apr_array_header_t *handles;
  +
  +    if (!librefs) {
  +	MP_TRACE_g(MP_FUNC,
  +                   "Could not get @%s for unloading.\n",
  +                   dl_librefs);
  +	return NULL;
  +    }
  +
  +    handles = apr_array_make(p, AvFILL(librefs)-1, sizeof(void *));
  +
  +    for (i=0; i<=AvFILL(librefs); i++) {
  +	void *handle;
  +	SV *handle_sv = *av_fetch(librefs, i, FALSE);
  +	SV *module_sv = *av_fetch(modules, i, FALSE);
  +
  +	if(!handle_sv) {
  +	    MP_TRACE_g(MP_FUNC,
  +                       "Could not fetch $%s[%d]!\n",
  +                       dl_librefs, (int)i);
  +	    continue;
  +	}
  +	handle = (void *)SvIV(handle_sv);
  +
  +	MP_TRACE_g(MP_FUNC, "%s dl handle == 0x%lx\n",
  +                   SvPVX(module_sv), (unsigned long)handle);
  +	if (handle) {
  +	    *(void **)apr_array_push(handles) = handle;
  +	}
  +    }
  +
  +    av_clear(modules);
  +    av_clear(librefs);
  +
  +    return handles;
  +}
  +
  +void modperl_xs_dl_handles_close(apr_array_header_t *handles)
  +{
  +    int i;
  +
  +    if (!handles) {
  +	return;
  +    }
  +
  +    for (i=0; i < handles->nelts; i++) {
  +	void *handle = ((void **)handles->elts)[i];
  +	MP_TRACE_g(MP_FUNC, "close 0x%lx\n",
  +                   (unsigned long)handle);
  +	dlclose(handle); /*XXX*/
  +    }
  +}
  +
  +modperl_cleanup_data_t *modperl_cleanup_data_new(apr_pool_t *p, void *data)
  +{
  +    modperl_cleanup_data_t *cdata =
  +        (modperl_cleanup_data_t *)apr_pcalloc(p, sizeof(*cdata));
  +    cdata->pool = p;
  +    cdata->data = data;
  +    return cdata;
  +}
  
  
  
  1.7       +8 -0      modperl-2.0/src/modules/perl/modperl_util.h
  
  Index: modperl_util.h
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_util.h,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- modperl_util.h	2001/03/14 05:22:50	1.6
  +++ modperl_util.h	2001/04/09 23:57:22	1.7
  @@ -29,4 +29,12 @@
   
   char *modperl_server_desc(server_rec *s, apr_pool_t *p);
   
  +void modperl_xs_dl_handles_clear(pTHXo);
  +
  +apr_array_header_t *modperl_xs_dl_handles_get(pTHX_ apr_pool_t *p);
  +
  +void modperl_xs_dl_handles_close(apr_array_header_t *handles);
  +
  +modperl_cleanup_data_t *modperl_cleanup_data_new(apr_pool_t *p, void *data);
  +
   #endif /* MODPERL_UTIL_H */