Stas Bekman <[EMAIL PROTECTED]> writes:
> I can't figure out whether PL_thr_key is a static global that survives
> perl_destruct and perl_free?
It is. because you find it declared in perlvars.h under the following
heading:
---------------------------------------------------------->%-------------
/****************/
/* Truly global */
/****************/
/* Don't forget to re-run embed.pl to propagate changes! */
/* This file describes the "global" variables used by perl
* This used to be in perl.h directly but we want to abstract out into
* distinct files which are per-thread, per-interpreter or really global,
* and how they're initialized.
*
* The 'G' prefix is only needed for vars that need appropriate #defines
* generated in embed*.h. Such symbols are also used to generate
* the appropriate export list for win32. */
/* global state */
PERLVAR(Gcurinterp, PerlInterpreter *)
/* currently running interpreter
* (initial parent interpreter under
* useithreads) */
#if defined(USE_5005THREADS) || defined(USE_ITHREADS)
PERLVAR(Gthr_key, perl_key) /* key to retrieve per-thread struct */
#endif
[...]
> If it does than this should work:
>
> Index: src/modules/perl/mod_perl.c
> ===================================================================
> --- src/modules/perl/mod_perl.c (revision 124805)
> +++ src/modules/perl/mod_perl.c (working copy)
> @@ -573,6 +573,19 @@
> MP_threads_started = 0;
> MP_post_post_config_phase = 0;
>
> + /* with USE_ITHREADS perl leaks pthread_key_t on every
> + * perl_destruct, which becomes a problem restarts: if the OS
> + * limit is 1024, 1024 restarts later things will start
> + * crashing */
> + /* XXX: this is a workaround for the bug in perl, once and if it's
> + * fixed we need to disable it for the versions that have it
> + * fixed */
> +#ifdef ALLOC_THREAD_KEY
> + if (PL_thr_key) {
> + FREE_THREAD_KEY;
> + }
> +#endif
> +
This would only work if the perl code is never re-entered after this.
Is this really the case?
The '#ifdef ALLOC_THREAD_KEY' is wrong AFAICT; this macro will always
be defined. Testing PL_thr_key as a boolean is outside of the spec of
what pthreads define. PL_curinterp will be set if the key has
initialized. That's a better test.
Does things not work if you just drop in the "perl_fini" destructor I
provided in mod_perl.c?
> MP_TRACE_i(MP_FUNC, "mod_perl sys term\n");
>
> modperl_env_unload();
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]