aboutsummaryrefslogtreecommitdiff
path: root/src/http/modules/perl/ngx_http_perl_module.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2009-04-16 14:42:31 +0000
committerIgor Sysoev <igor@sysoev.ru>2009-04-16 14:42:31 +0000
commitc26e7b9d49cf2d143b194342bf8d6f37de6ae197 (patch)
tree09f36a41c20f2e39112b229942b7c4d9d1010eff /src/http/modules/perl/ngx_http_perl_module.c
parente4ecddfdb0d2ffc872658e36028971ad9a873726 (diff)
downloadnginx-c26e7b9d49cf2d143b194342bf8d6f37de6ae197.tar.gz
nginx-c26e7b9d49cf2d143b194342bf8d6f37de6ae197.zip
perl termination fixes:
*) master exit hook is run before global pool cleanup, so call PERL_SYS_TERM() after perl_destruct()/perl_free(). This fixes the message panic: MUTEX_LOCK (22) [op.c:352] on some threaded perl builds *) call perl_destruct()/perl_free() before PERL_SYS_TERM() for non-mulitiplicity perl
Diffstat (limited to 'src/http/modules/perl/ngx_http_perl_module.c')
-rw-r--r--src/http/modules/perl/ngx_http_perl_module.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/src/http/modules/perl/ngx_http_perl_module.c b/src/http/modules/perl/ngx_http_perl_module.c
index a5462122b..d57a9b16b 100644
--- a/src/http/modules/perl/ngx_http_perl_module.c
+++ b/src/http/modules/perl/ngx_http_perl_module.c
@@ -154,10 +154,14 @@ static ngx_http_ssi_command_t ngx_http_perl_ssi_command = {
#endif
-static ngx_str_t ngx_null_name = ngx_null_string;
+static ngx_str_t ngx_null_name = ngx_null_string;
+static HV *nginx_stash;
+
+#if (NGX_HAVE_PERL_MULTIPLICITY)
+static ngx_uint_t ngx_perl_term;
+#endif
-static HV *nginx_stash;
static void
ngx_http_perl_xs_init(pTHX)
@@ -821,6 +825,12 @@ ngx_http_perl_cleanup_perl(void *data)
(void) perl_destruct(perl);
perl_free(perl);
+
+ if (ngx_perl_term) {
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0, "perl term");
+
+ PERL_SYS_TERM();
+ }
}
#endif
@@ -1057,14 +1067,24 @@ ngx_http_perl_init_worker(ngx_cycle_t *cycle)
static void
ngx_http_perl_exit(ngx_cycle_t *cycle)
{
+#if (NGX_HAVE_PERL_MULTIPLICITY)
+
+ ngx_perl_term = 1;
+
+#else
ngx_http_perl_main_conf_t *pmcf;
pmcf = ngx_http_cycle_get_module_main_conf(cycle, ngx_http_perl_module);
- if (pmcf) {
- dTHXa(pmcf->perl);
- PERL_SET_CONTEXT(pmcf->perl);
+ if (pmcf && nginx_stash) {
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cycle->log, 0, "perl term");
+
+ (void) perl_destruct(pmcf->perl);
+
+ perl_free(pmcf->perl);
PERL_SYS_TERM();
}
+
+#endif
}