cvs commit: modperl-2.0/src/modules/perl mod_perl.c modperl_interp.c
dougm 2002/06/20 21:16:51 Modified:src/modules/perl mod_perl.c modperl_interp.c Log: move modperl_pp_{set,unset}_all and modperl_init_{init,unload} to modperl_sys_{init,term} functions that only happen once per-parent process Revision ChangesPath 1.128 +16 -5 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.127 retrieving revision 1.128 diff -u -r1.127 -r1.128 --- mod_perl.c21 Jun 2002 00:44:24 - 1.127 +++ mod_perl.c21 Jun 2002 04:16:51 - 1.128 @@ -202,10 +202,6 @@ return; } -modperl_perl_pp_set_all(); - -modperl_env_init(); - base_perl = modperl_startup(base_server, p); #ifdef USE_ITHREADS @@ -330,6 +326,10 @@ modperl_tls_create_request_rec(pconf); } +/* + * modperl_sys_{init,term} are things that happen + * once per-parent process, not per-interpreter + */ static apr_status_t modperl_sys_init(void) { #if 0 /*XXX*/ @@ -345,11 +345,22 @@ } #endif #endif + +/* modifies PL_ppaddr */ +modperl_perl_pp_set_all(); + +/* modifies PL_vtbl_env{elem} */ +modperl_env_init(); + return APR_SUCCESS; } static apr_status_t modperl_sys_term(void *data) { +modperl_env_unload(); + +modperl_perl_pp_unset_all(); + #if 0 /*XXX*/ PERL_SYS_TERM(); #endif @@ -362,7 +373,7 @@ apr_pool_create(&server_pool, pconf); modperl_sys_init(); -apr_pool_cleanup_register(server_pool, NULL, +apr_pool_cleanup_register(pconf, NULL, modperl_sys_term, apr_pool_cleanup_null); modperl_init_globals(s, pconf); modperl_init(s, pconf); 1.50 +0 -4 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.49 retrieving revision 1.50 diff -u -r1.49 -r1.50 --- modperl_interp.c 21 Jun 2002 03:46:46 - 1.49 +++ modperl_interp.c 21 Jun 2002 04:16:51 - 1.50 @@ -152,10 +152,6 @@ modperl_interp_destroy(mip->parent); } -modperl_env_unload(); - -modperl_perl_pp_unset_all(); - return APR_SUCCESS; }
cvs commit: modperl-2.0/src/modules/perl modperl_interp.c
dougm 2002/06/20 20:46:46 Modified:src/modules/perl modperl_interp.c Log: cannot dereference mip->parent after it has been free-d Revision ChangesPath 1.49 +0 -2 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.48 retrieving revision 1.49 diff -u -r1.48 -r1.49 --- modperl_interp.c 21 Jun 2002 03:02:54 - 1.48 +++ modperl_interp.c 21 Jun 2002 03:46:46 - 1.49 @@ -152,8 +152,6 @@ modperl_interp_destroy(mip->parent); } -mip->parent->perl = NULL; - modperl_env_unload(); modperl_perl_pp_unset_all();
cvs commit: modperl-2.0/xs/tables/current/ModPerl FunctionTable.pm
dougm 2002/06/20 20:04:36 Modified:xs/tables/current/ModPerl FunctionTable.pm Log: sync Revision ChangesPath 1.74 +4 -21 modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm Index: FunctionTable.pm === RCS file: /home/cvs/modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm,v retrieving revision 1.73 retrieving revision 1.74 diff -u -r1.73 -r1.74 --- FunctionTable.pm 21 Jun 2002 00:07:24 - 1.73 +++ FunctionTable.pm 21 Jun 2002 03:04:36 - 1.74 @@ -2,7 +2,7 @@ # !! # ! WARNING: generated by ModPerl::ParseSource/0.01 -# ! Thu Jun 20 16:54:53 2002 +# ! Thu Jun 20 19:51:30 2002 # ! do NOT edit, any changes will be lost ! # !! @@ -2275,10 +2275,6 @@ 'name' => 'modperl_interp_new', 'args' => [ { -'type' => 'apr_pool_t *', -'name' => 'p' - }, - { 'type' => 'modperl_interp_pool_t *', 'name' => 'mip' }, @@ -2470,12 +2466,7 @@ { 'return_type' => 'modperl_list_t *', 'name' => 'modperl_list_new', -'args' => [ - { -'type' => 'apr_pool_t *', -'name' => 'p' - } -] +'args' => [] }, { 'return_type' => 'modperl_list_t *', @@ -3975,26 +3966,18 @@ 'name' => 'modperl_xs_dl_handles_close', 'args' => [ { -'type' => 'apr_pool_t *', -'name' => 'p' - }, - { -'type' => 'apr_array_header_t *', +'type' => 'void **', 'name' => 'handles' } ] }, { -'return_type' => 'apr_array_header_t *', +'return_type' => 'void **', 'name' => 'modperl_xs_dl_handles_get', 'args' => [ { 'type' => 'PerlInterpreter *', 'name' => 'my_perl' - }, - { -'type' => 'apr_pool_t *', -'name' => 'p' } ] },
cvs commit: modperl-2.0/src/modules/perl modperl_interp.c modperl_interp.h modperl_tipool.c modperl_tipool.h modperl_types.h
dougm 2002/06/20 20:02:54 Modified:src/modules/perl modperl_interp.c modperl_interp.h modperl_tipool.c modperl_tipool.h modperl_types.h Log: stop using an apr_pool_t to allocate items for the interpreter pool: -even though we lock, the pool is read by modules other than mod_perl -when a PerlInterpreter is released to to PerlInterp{MaxRequests,MinSpare} the pool item allocation "leaks" because the server pool is not cleared until restart Revision ChangesPath 1.48 +9 -7 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.47 retrieving revision 1.48 diff -u -r1.47 -r1.48 --- modperl_interp.c 21 Jun 2002 00:44:24 - 1.47 +++ modperl_interp.c 21 Jun 2002 03:02:54 - 1.48 @@ -35,14 +35,15 @@ modperl_xs_dl_handles_clear(aTHX); } -modperl_interp_t *modperl_interp_new(apr_pool_t *p, - modperl_interp_pool_t *mip, +modperl_interp_t *modperl_interp_new(modperl_interp_pool_t *mip, PerlInterpreter *perl) { UV clone_flags = 0; modperl_interp_t *interp = -(modperl_interp_t *)apr_pcalloc(p, sizeof(*interp)); - +(modperl_interp_t *)malloc(sizeof(*interp)); + +memset(interp, '\0', sizeof(*interp)); + interp->mip = mip; interp->refcnt = 0; /* for use by APR::Pool->cleanup_register */ @@ -97,6 +98,8 @@ modperl_perl_destruct(interp->perl); modperl_xs_dl_handles_close(handles); + +free(interp); } apr_status_t modperl_interp_cleanup(void *data) @@ -162,7 +165,7 @@ { modperl_interp_pool_t *mip = (modperl_interp_pool_t *)data; MP_TRACE_i(MP_FUNC, "adding new interpreter to the pool\n"); -return (void *)modperl_interp_new(mip->ap_pool, mip, mip->parent->perl); +return (void *)modperl_interp_new(mip, mip->parent->perl); } static void interp_pool_shrink(modperl_tipool_t *tipool, void *data, @@ -206,9 +209,8 @@ &interp_pool_func, mip); mip->tipool = tipool; -mip->ap_pool = p; mip->server = s; -mip->parent = modperl_interp_new(p, mip, NULL); +mip->parent = modperl_interp_new(mip, NULL); aTHX = mip->parent->perl = perl; /* this happens post-config in mod_perl.c:modperl_init_clones() */ 1.16 +1 -2 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.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- modperl_interp.h 13 Jun 2002 02:59:05 - 1.15 +++ modperl_interp.h 21 Jun 2002 03:02:54 - 1.16 @@ -23,8 +23,7 @@ void modperl_interp_clone_init(modperl_interp_t *interp); -modperl_interp_t *modperl_interp_new(apr_pool_t *p, - modperl_interp_pool_t *mip, +modperl_interp_t *modperl_interp_new(modperl_interp_pool_t *mip, PerlInterpreter *perl); void modperl_interp_destroy(modperl_interp_t *interp); 1.8 +6 -4 modperl-2.0/src/modules/perl/modperl_tipool.c Index: modperl_tipool.c === RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_tipool.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- modperl_tipool.c 8 Mar 2002 02:48:01 - 1.7 +++ modperl_tipool.c 21 Jun 2002 03:02:54 - 1.8 @@ -15,10 +15,11 @@ * this is another "proof-of-concept", plenty of room for improvement here */ -modperl_list_t *modperl_list_new(apr_pool_t *p) +modperl_list_t *modperl_list_new() { modperl_list_t *listp = -(modperl_list_t *)apr_pcalloc(p, sizeof(*listp)); +(modperl_list_t *)malloc(sizeof(*listp)); +memset(listp, '\0', sizeof(*listp)); return listp; } @@ -151,7 +152,6 @@ modperl_tipool_t *tipool = (modperl_tipool_t *)apr_pcalloc(p, sizeof(*tipool)); -tipool->ap_pool = p; tipool->cfg = cfg; tipool->func = func; tipool->data = data; @@ -201,7 +201,7 @@ void modperl_tipool_add(modperl_tipool_t *tipool, void *data) { -modperl_list_t *listp = modperl_list_new(tipool->ap_pool); +modperl_list_t *listp = modperl_list_new(); listp->data = data; @@ -339,6 +339,8 @@ (*tipool->func->tipool_destroy)(tipool, tipool->data, listp->data); } + +free
cvs commit: modperl-2.0/xs/APR/PerlIO apr_perlio.c
dougm 2002/06/20 19:06:48 Modified:xs/APR/PerlIO apr_perlio.c Log: bleedperl now has a binmode PerlIO function Revision ChangesPath 1.15 +1 -0 modperl-2.0/xs/APR/PerlIO/apr_perlio.c Index: apr_perlio.c === RCS file: /home/cvs/modperl-2.0/xs/APR/PerlIO/apr_perlio.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- apr_perlio.c 31 May 2002 15:41:40 - 1.14 +++ apr_perlio.c 21 Jun 2002 02:06:48 - 1.15 @@ -321,6 +321,7 @@ PerlIOBase_pushed, PerlIOAPR_popped, PerlIOAPR_open, +NULL, /* XXX: binmode? */ NULL, /* no getarg needed */ PerlIOAPR_fileno, PerlIOAPR_dup,
cvs commit: modperl-2.0/src/modules/perl modperl_sys.c
dougm 2002/06/20 18:32:56 Modified:src/modules/perl modperl_sys.c Log: hpux fix Revision ChangesPath 1.3 +1 -0 modperl-2.0/src/modules/perl/modperl_sys.c Index: modperl_sys.c === RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_sys.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- modperl_sys.c 21 Jun 2002 00:48:01 - 1.2 +++ modperl_sys.c 21 Jun 2002 01:32:56 - 1.3 @@ -18,6 +18,7 @@ #elif defined(MP_SYS_DL_DYLD) return NSUnLinkModule(handle, FALSE); #elif defined(MP_SYS_DL_HPUX) +#include shl_unload((shl_t)handle); return 1; #elif defined(MP_SYS_DL_WIN32)
cvs commit: modperl-2.0/src/modules/perl modperl_sys.c
dougm 2002/06/20 17:48:01 Modified:src/modules/perl modperl_sys.c Log: fix for darwin Revision ChangesPath 1.2 +1 -1 modperl-2.0/src/modules/perl/modperl_sys.c Index: modperl_sys.c === RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_sys.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- modperl_sys.c 21 Jun 2002 00:05:17 - 1.1 +++ modperl_sys.c 21 Jun 2002 00:48:01 - 1.2 @@ -16,7 +16,7 @@ #endif return dlclose(handle) == 0; #elif defined(MP_SYS_DL_DYLD) -return NSUnlinkModule(handle, FALSE); +return NSUnLinkModule(handle, FALSE); #elif defined(MP_SYS_DL_HPUX) shl_unload((shl_t)handle); return 1;
cvs commit: modperl-2.0/src/modules/perl mod_perl.c modperl_interp.c modperl_util.c modperl_util.h
dougm 2002/06/20 17:44:24 Modified:src/modules/perl mod_perl.c modperl_interp.c modperl_util.c modperl_util.h Log: use our own modperl_sys_dlclose instead of apr_dso_unload which requires us to create our own pool. Revision ChangesPath 1.127 +3 -5 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.126 retrieving revision 1.127 diff -u -r1.126 -r1.127 --- mod_perl.c16 Jun 2002 01:07:37 - 1.126 +++ mod_perl.c21 Jun 2002 00:44:24 - 1.127 @@ -5,18 +5,16 @@ { modperl_cleanup_data_t *cdata = (modperl_cleanup_data_t *)data; PerlInterpreter *perl = (PerlInterpreter *)cdata->data; -apr_array_header_t *handles; +void **handles; -handles = modperl_xs_dl_handles_get(aTHX_ cdata->pool); +handles = modperl_xs_dl_handles_get(aTHX); MP_TRACE_i(MP_FUNC, "destroying interpreter=0x%lx\n", (unsigned long)perl); modperl_perl_destruct(perl); -if (handles) { -modperl_xs_dl_handles_close(cdata->pool, handles); -} +modperl_xs_dl_handles_close(handles); modperl_env_unload(); 1.47 +3 -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.46 retrieving revision 1.47 diff -u -r1.46 -r1.47 --- modperl_interp.c 17 Jun 2002 20:00:44 - 1.46 +++ modperl_interp.c 21 Jun 2002 00:44:24 - 1.47 @@ -80,8 +80,7 @@ void modperl_interp_destroy(modperl_interp_t *interp) { -apr_pool_t *p = NULL; -apr_array_header_t *handles; +void **handles; dTHXa(interp->perl); PERL_SET_CONTEXT(interp->perl); @@ -93,21 +92,11 @@ MP_TRACE_i(MP_FUNC, "*error - still in use!*\n"); } -/* 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); +handles = modperl_xs_dl_handles_get(aTHX); modperl_perl_destruct(interp->perl); -if (handles) { -modperl_xs_dl_handles_close(p, handles); -} - -apr_pool_destroy(p); +modperl_xs_dl_handles_close(handles); } apr_status_t modperl_interp_cleanup(void *data) 1.47 +12 -13modperl-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.46 retrieving revision 1.47 diff -u -r1.46 -r1.47 --- modperl_util.c19 Jun 2002 05:18:04 - 1.46 +++ modperl_util.c21 Jun 2002 00:44:24 - 1.47 @@ -300,12 +300,12 @@ } } -apr_array_header_t *modperl_xs_dl_handles_get(pTHX_ apr_pool_t *p) +void **modperl_xs_dl_handles_get(pTHX) { I32 i; AV *librefs = get_av(dl_librefs, FALSE); AV *modules = get_av(dl_modules, FALSE); -apr_array_header_t *handles; +void **handles; if (!librefs) { MP_TRACE_g(MP_FUNC, @@ -319,7 +319,7 @@ return NULL; } -handles = apr_array_make(p, AvFILL(librefs)-1, sizeof(void *)); +handles = (void **)malloc(sizeof(void *) * (AvFILL(librefs)+2)); for (i=0; i<=AvFILL(librefs); i++) { void *handle; @@ -337,17 +337,19 @@ 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; + handles[i] = handle; } } av_clear(modules); av_clear(librefs); +handles[i] = (void *)0; + return handles; } -void modperl_xs_dl_handles_close(apr_pool_t *p, apr_array_header_t *handles) +void modperl_xs_dl_handles_close(void **handles) { int i; @@ -355,15 +357,12 @@ return; } -for (i=0; i < handles->nelts; i++) { -apr_dso_handle_t *dso = NULL; -void *handle = ((void **)handles->elts)[i]; - -MP_TRACE_g(MP_FUNC, "close 0x%lx\n", (unsigned long)handle); - -apr_os_dso_handle_put(&dso, (apr_os_dso_handle_t )handle, p); -apr_dso_unload(dso); +for (i=0; handles[i]; i++) { +MP_TRACE_g(MP_FUNC, "close 0x%lx\n", (unsigned long)handles[i]); +modperl_sys_dlclose(handles[i]); } + +free(ha
cvs commit: modperl-2.0/xs/tables/current/ModPerl FunctionTable.pm
dougm 2002/06/20 17:07:25 Modified:xs/tables/current/ModPerl FunctionTable.pm Log: sync Revision ChangesPath 1.73 +11 -1 modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm Index: FunctionTable.pm === RCS file: /home/cvs/modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm,v retrieving revision 1.72 retrieving revision 1.73 diff -u -r1.72 -r1.73 --- FunctionTable.pm 16 Jun 2002 01:09:18 - 1.72 +++ FunctionTable.pm 21 Jun 2002 00:07:24 - 1.73 @@ -2,7 +2,7 @@ # !! # ! WARNING: generated by ModPerl::ParseSource/0.01 -# ! Sat Jun 15 17:57:19 2002 +# ! Thu Jun 20 16:54:53 2002 # ! do NOT edit, any changes will be lost ! # !! @@ -3581,6 +3581,16 @@ { 'type' => 'SV *', 'name' => 'sv' + } +] + }, + { +'return_type' => 'int', +'name' => 'modperl_sys_dlclose', +'args' => [ + { +'type' => 'void *', +'name' => 'handle' } ] },
cvs commit: modperl-2.0/src/modules/perl mod_perl.h
dougm 2002/06/20 17:05:49 Modified:lib/ModPerl Code.pm src/modules/perl mod_perl.h Log: integrate modperl_sys modules Revision ChangesPath 1.83 +6 -1 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.82 retrieving revision 1.83 diff -u -r1.82 -r1.83 --- Code.pm 16 Jun 2002 01:09:46 - 1.82 +++ Code.pm 21 Jun 2002 00:05:49 - 1.83 @@ -2,6 +2,7 @@ use strict; use warnings FATAL => 'all'; +use Config; use mod_perl (); use Apache::Build (); @@ -346,6 +347,10 @@ my $n = 1; +(my $dlsrc = uc $Config{dlsrc}) =~ s/\.xs$//i; + +print $h_fh "\n#define MP_SYS_$dlsrc 1\n"; + while (my($class, $opts) = each %{ $self->{flags} }) { my $i = 0; my @lookup = (); @@ -563,7 +568,7 @@ my @c_src_names = qw(interp tipool log config cmd options callback handler gtop util io filter bucket mgv pcw global env cgi - perl perl_global perl_pp); + perl perl_global perl_pp sys); my @g_c_names = map { "modperl_$_" } qw(hooks directives flags xsinit); my @c_names = ('mod_perl', (map "modperl_$_", @c_src_names)); sub c_files { [map { "$_.c" } @c_names, @g_c_names] } 1.48 +1 -0 modperl-2.0/src/modules/perl/mod_perl.h Index: mod_perl.h === RCS file: /home/cvs/modperl-2.0/src/modules/perl/mod_perl.h,v retrieving revision 1.47 retrieving revision 1.48 diff -u -r1.47 -r1.48 --- mod_perl.h19 Jun 2002 05:18:04 - 1.47 +++ mod_perl.h21 Jun 2002 00:05:49 - 1.48 @@ -18,6 +18,7 @@ #include "modperl_hooks.h" #include "modperl_perl_global.h" #include "modperl_perl_pp.h" +#include "modperl_sys.h" /* both perl and apr have largefile support enabled */ #define MP_LARGE_FILES_ENABLED \
cvs commit: modperl-2.0/src/modules/perl modperl_sys.c modperl_sys.h
dougm 2002/06/20 17:05:17 Added: src/modules/perl modperl_sys.c modperl_sys.h Log: rolling our own modperl_sys_dlclose() to avoid apr/pool overhead/thread issues Revision ChangesPath 1.1 modperl-2.0/src/modules/perl/modperl_sys.c Index: modperl_sys.c === #include "mod_perl.h" /* * Perl does not provide this abstraction. * APR does, but requires a pool. efforts to expose this area of apr * failed. so we roll our own. *sigh* */ int modperl_sys_dlclose(void *handle) { #if defined(MP_SYS_DL_DLOPEN) #ifdef I_DLFCN #include #else #include #include #endif return dlclose(handle) == 0; #elif defined(MP_SYS_DL_DYLD) return NSUnlinkModule(handle, FALSE); #elif defined(MP_SYS_DL_HPUX) shl_unload((shl_t)handle); return 1; #elif defined(MP_SYS_DL_WIN32) return FreeLibrary(handle); #elif defined(MP_SYS_DL_BEOS) return unload_add_on(handle) < B_NO_ERROR; #elif defined(MP_SYS_DL_DLLLOAD) return dllfree(handle) == 0; #elif defined(MP_SYS_DL_AIX) return dlclose(handle) == 0; #else #error "modperl_sys_dlclose not defined on this platform" return 0; #endif } 1.1 modperl-2.0/src/modules/perl/modperl_sys.h Index: modperl_sys.h === #ifndef MODPERL_SYS_H #define MODPERL_SYS_H /* * system specific type stuff. * hopefully won't be much here since Perl/APR/Apache * take care of most portablity issues. */ int modperl_sys_dlclose(void *handle); #endif /* MODPERL_SYS_H */
cvs commit: modperl-2.0 STATUS
stas2002/06/20 11:31:16 Modified:.STATUS Log: log the Apache::Log issues for a future resolution Revision ChangesPath 1.4 +43 -7 modperl-2.0/STATUS Index: STATUS === RCS file: /home/cvs/modperl-2.0/STATUS,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- STATUS4 Jun 2002 13:01:20 - 1.3 +++ STATUS20 Jun 2002 18:31:16 - 1.4 @@ -4,9 +4,10 @@ Release: - 1.99_03-dev: In development - 1.99_02-dev: Released June 01, 2002 - 1.99_01: Released April 06, 2002 + 1.99_04-dev: In development + 1.99_03-dev: Released Jun 16, 2002 + 1.99_02-dev: Released Jun 01, 2002 + 1.99_01: Released Apr 06, 2002 === @@ -28,6 +29,15 @@ Available Patches: -- +* Fixing Apache->warn("foo") + Report: Message-ID: <[EMAIL PROTECTED]> + Status: pending Apache::Log compat issues, this and other methods + might be dropped. + + +* + Report: + Status: Needs Patch or Further Investigation: - @@ -36,6 +46,32 @@ Open Issues or Core Enhancements: - +* Apache::Log compat issues: + + Apache->warn, Apache::warn, Apache::Server->warn and + Apache->Apache::Server->log_error are all doing: + s = modperl_global_get_server_rec(); + and this function is thread safe only during the startup. + + possible solutions: + + 1) enforce that these functions are used only at the server startup + + 2) require +GlobalRequest, which gives us r->server, now thread + safe (though slow). + + 3) drop them all from the API and move to compat. + [remember that Apache::warn is needed for registry scripts to + override warn()] + + Report: Message-ID: <[EMAIL PROTECTED]> + Status: + + + +* + Report: + Status: Documentation: -- @@ -44,7 +80,7 @@ Patches unlikely to be applied: --- - * - Report: - Status: +* + Report: + Status: