perl-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stas Bekman <s...@stason.org>
Subject Re: [PATCH] libperl leaks a THREAD_KEY each time it is reloaded
Date Tue, 11 Jan 2005 16:27:08 GMT
I can't figure out whether PL_thr_key is a static global that survives 
perl_destruct and perl_free? 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
+
      MP_TRACE_i(MP_FUNC, "mod_perl sys term\n");

      modperl_env_unload();
@@ -658,6 +671,20 @@
      dTHXa(scfg->mip->parent->perl);
  #endif

+    {
+        pthread_key_t key;
+        int i = 0;
+        for (i=0; i<512; i++) {
+            if (pthread_key_create(&key, 0) == 0) {
+                Perl_warn(aTHX_ "%d\n", 1+i);
+            }
+            else {
+                Perl_croak(aTHX_ "failed to create the key: %d\n", i+1);
+            }
+        }
+    }
+
+
      if (!modperl_post_config_require(s, pconf)) {
          exit(1);
      }

if not, then we need to store the key elsewhere as following:

Index: src/modules/perl/mod_perl.c
===================================================================
--- src/modules/perl/mod_perl.c	(revision 124805)
+++ src/modules/perl/mod_perl.c	(working copy)
@@ -51,6 +51,10 @@
      return MP_post_post_config_phase;
  }

+#ifdef ALLOC_THREAD_KEY
+static pthread_key_t *MP_PL_thr_key = NULL;
+#endif
+
  #ifndef USE_ITHREADS
  static apr_status_t modperl_shutdown(void *data)
  {
@@ -192,6 +196,7 @@
      int status;
      char **argv;
      int argc;
+    server_rec *base_server = modperl_global_get_server_rec();
  #ifndef USE_ITHREADS
      modperl_cleanup_data_t *cdata;
  #endif
@@ -200,7 +205,6 @@
       * one, if modperl_startup was called by vhost before the former
       * was started */
      if (MP_init_status != 2) {
-        server_rec *base_server = modperl_global_get_server_rec();
          PerlInterpreter *base_perl;

          MP_init_status = 2; /* calls itself, so set the flag early */
@@ -213,7 +217,6 @@

  #ifdef MP_TRACE
      {
-        server_rec *base_server = modperl_global_get_server_rec();
          const char *desc = modperl_server_desc(s, p);
          if (base_server == s) {
              MP_TRACE_i(MP_FUNC,
@@ -271,6 +274,20 @@
      PL_reentrant_buffer->_crypt_struct.current_saltbits = 0;
  #endif

+    /* 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 (base_server == s) {
+        MP_PL_thr_key = &PL_thr_key;
+        Perl_warn(aTHX_ "global pthread key 0x%lx\n", MP_PL_thr_key);
+    }
+#endif
+
      perl_run(perl);

  #ifdef USE_ITHREADS
@@ -573,6 +590,14 @@
      MP_threads_started = 0;
      MP_post_post_config_phase = 0;

+#ifdef ALLOC_THREAD_KEY
+    if (MP_PL_thr_key) {
+        /* FREE_THREAD_KEY */
+        pthread_key_delete(*MP_PL_thr_key);
+        MP_PL_thr_key = NULL;
+    }
+#endif
+
      MP_TRACE_i(MP_FUNC, "mod_perl sys term\n");

      modperl_env_unload();
@@ -658,6 +683,20 @@
      dTHXa(scfg->mip->parent->perl);
  #endif

+    {
+        pthread_key_t key;
+        int i = 0;
+        for (i=0; i<512; i++) {
+            if (pthread_key_create(&key, 0) == 0) {
+                Perl_warn(aTHX_ "%d\n", 1+i);
+            }
+            else {
+                Perl_croak(aTHX_ "failed to create the key: %d\n", i+1);
+            }
+        }
+    }
+
+
      if (!modperl_post_config_require(s, pconf)) {
          exit(1);
      }


-- 
__________________________________________________________________
Stas Bekman            JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/     mod_perl Guide ---> http://perl.apache.org
mailto:stas@stason.org http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org   http://ticketmaster.com

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@perl.apache.org
For additional commands, e-mail: dev-help@perl.apache.org


Mime
View raw message