diff options
author | Igor Sysoev <igor@sysoev.ru> | 2009-04-16 14:42:31 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2009-04-16 14:42:31 +0000 |
commit | c26e7b9d49cf2d143b194342bf8d6f37de6ae197 (patch) | |
tree | 09f36a41c20f2e39112b229942b7c4d9d1010eff /src/http/modules/perl/ngx_http_perl_module.c | |
parent | e4ecddfdb0d2ffc872658e36028971ad9a873726 (diff) | |
download | nginx-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.c | 30 |
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 } |