panic MUTEX_LOCK

Igor Sysoev is at rambler-co.ru
Thu Apr 16 13:09:17 MSD 2009


On Thu, Apr 16, 2009 at 12:08:17PM +0400, Igor Sysoev wrote:

> On Thu, Apr 16, 2009 at 11:10:07AM +0400, Igor Sysoev wrote:
> 
> > У кого-нибудь воспроизводится panic MUTEX_LOCK, если nginx собран с перлом ?
> > 
> > Я сейчас попробовал 0.7.51 с perl'ом
> > v5.8.8 built for i486-linux-gnu-thread-multi
> > на Дебиане - не воспроизводится.
> 
> Воспроизвелось на CentOS 5.2:
> v5.8.8 built for i386-linux-thread-multi
> 
> Казалось бы, в чём отличие ?

Патч для 0.7.51.

Желательно проверить сборку и работу на разных платформах с имеющимся
там перлом - threaded или non-threaded. Для проверки работы достаточно
просто запустить nginx сделать ему пару раз -HUP, а потом остановить.


-- 
Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
Index: src/http/ngx_http_config.h
===================================================================
--- src/http/ngx_http_config.h	(revision 2032)
+++ src/http/ngx_http_config.h	(working copy)
@@ -69,8 +69,10 @@
     ((ngx_http_conf_ctx_t *) cf->ctx)->loc_conf[module.ctx_index]
 
 #define ngx_http_cycle_get_module_main_conf(cycle, module)                    \
-    ((ngx_http_conf_ctx_t *)                                                  \
-         cycle->conf_ctx[ngx_http_module.index])->main_conf[module.ctx_index]
+    (cycle->conf_ctx[ngx_http_module.index] ?                                 \
+        ((ngx_http_conf_ctx_t *) cycle->conf_ctx[ngx_http_module.index])      \
+            ->main_conf[module.ctx_index]:                                    \
+        NULL)
 
 
 #endif /* _NGX_HTTP_CONFIG_H_INCLUDED_ */
Index: src/http/modules/perl/ngx_http_perl_module.c
===================================================================
--- src/http/modules/perl/ngx_http_perl_module.c	(revision 2032)
+++ src/http/modules/perl/ngx_http_perl_module.c	(working copy)
@@ -154,11 +154,15 @@
 #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;
 
-static HV  *nginx_stash;
+#if (NGX_HAVE_PERL_MULTIPLICITY)
+static ngx_uint_t   ngx_perl_term;
+#endif
 
+
 static void
 ngx_http_perl_xs_init(pTHX)
 {
@@ -821,6 +825,10 @@
     (void) perl_destruct(perl);
 
     perl_free(perl);
+
+    if (ngx_perl_term) {
+        PERL_SYS_TERM();
+    }
 }
 
 #endif
@@ -1041,15 +1049,13 @@
 
     pmcf = ngx_http_cycle_get_module_main_conf(cycle, ngx_http_perl_module);
 
-    {
+    if (pmcf) {
+        dTHXa(pmcf->perl);
+        PERL_SET_CONTEXT(pmcf->perl);
 
-    dTHXa(pmcf->perl);
-    PERL_SET_CONTEXT(pmcf->perl);
+        /* set worker's $$ */
 
-    /* set worker's $$ */
-
-    sv_setiv(GvSV(gv_fetchpv("$", TRUE, SVt_PV)), (I32) ngx_pid);
-
+        sv_setiv(GvSV(gv_fetchpv("$", TRUE, SVt_PV)), (I32) ngx_pid);
     }
 
     return NGX_OK;
@@ -1059,16 +1065,15 @@
 static void
 ngx_http_perl_exit(ngx_cycle_t *cycle)
 {
-    ngx_http_perl_main_conf_t  *pmcf;
+#if (NGX_HAVE_PERL_MULTIPLICITY)
 
-    pmcf = ngx_http_cycle_get_module_main_conf(cycle, ngx_http_perl_module);
+    ngx_perl_term = 1;
 
-    {
+#else
 
-    dTHXa(pmcf->perl);
-    PERL_SET_CONTEXT(pmcf->perl);
+    if (nginx_stash) {
+        PERL_SYS_TERM();
+    }
 
-    PERL_SYS_TERM();
-
-    }
+#endif
 }


More information about the nginx-ru mailing list