использование perl_set

Igor Sysoev is at rambler-co.ru
Fri Nov 24 17:10:06 MSK 2006


On Fri, 24 Nov 2006, Veryazov Sergey wrote:

> Беру код из примера:
> http://www.sysoev.ru/nginx/docs/http/ngx_http_perl_module.html
>
> Выдает ошибку:
>
> 2006/11/24 12:01:40 [error] 30314#0: *3 call_sv("
>
>   sub {
>   my $r = shift;
>   my $ua = $r->header_in("User-Agent");
>
>   return "" if $ua =~ /Opera/;
>   return "1" if $ua =~ / MSIE [6-9]\.\d+/;
>   return "";
>   }
>
>   ") failed: "Can't call method "header_in" on an undefined value at (eval 
> 2) line 3."
>
> Оказывается, что параметр запроса не передается в функцию:
> perl_set  $test 'sub { my $r = shift; return "($r)" }';
> в итоге $test = '()';
>
> В чем проблема?
>
> nginx version: nginx/0.4.13
> built by gcc 4.1.1 20060525 (Red Hat 4.1.1-1)
>
> $perl -v
> This is perl, v5.8.8 built for x86_64-linux-thread-multi

По-видимому, начиная с 0.3.38, nginx не работал с трэдовым перлом.
Патч прилагается.


Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
Index: src/http/modules/perl/ngx_http_perl_module.c
===================================================================
--- src/http/modules/perl/ngx_http_perl_module.c	(revision 187)
+++ src/http/modules/perl/ngx_http_perl_module.c	(working copy)
@@ -74,7 +74,7 @@
 static char *ngx_http_perl_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
 static char *ngx_http_perl_interp_max_unsupported(ngx_conf_t *cf, void *post,
     void *data);
-#if (NGX_HAVE_PERL_CLONE || NGX_HAVE_PERL_MULTIPLICITY)
+#if (NGX_HAVE_PERL_MULTIPLICITY)
 static void ngx_http_perl_cleanup_perl(void *data);
 #endif
 static void ngx_http_perl_cleanup_sv(void *data);
@@ -478,7 +478,7 @@
 static char *
 ngx_http_perl_init_interpreter(ngx_conf_t *cf, ngx_http_perl_main_conf_t *pmcf)
 {
-#if (NGX_HAVE_PERL_CLONE || NGX_HAVE_PERL_MULTIPLICITY)
+#if (NGX_HAVE_PERL_MULTIPLICITY)
     ngx_pool_cleanup_t       *cln;
 
     cln = ngx_pool_cleanup_add(cf->pool, 0);
@@ -502,7 +502,7 @@
         }
     }
 
-#if !(NGX_HAVE_PERL_CLONE || NGX_HAVE_PERL_MULTIPLICITY)
+#if !(NGX_HAVE_PERL_MULTIPLICITY)
 
     if (perl) {
         if (ngx_http_perl_run_requires(aTHX_ &pmcf->requires, cf->log)
@@ -527,7 +527,7 @@
         return NGX_CONF_ERROR;
     }
 
-#if (NGX_HAVE_PERL_CLONE || NGX_HAVE_PERL_MULTIPLICITY)
+#if (NGX_HAVE_PERL_MULTIPLICITY)
 
     cln->handler = ngx_http_perl_cleanup_perl;
     cln->data = pmcf->perl;
@@ -554,32 +554,6 @@
 
     ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "create perl interpreter");
 
-#if (NGX_HAVE_PERL_CLONE)
-
-    if (pmcf->perl) {
-
-        perl = perl_clone(pmcf->perl, CLONEf_KEEP_PTR_TABLE);
-        if (perl == NULL) {
-            ngx_log_error(NGX_LOG_ALERT, log, 0, "perl_clone() failed");
-            return NULL;
-        }
-
-        {
-
-        dTHXa(perl);
-
-        ptr_table_free(PL_ptr_table);
-        PL_ptr_table = NULL;
-
-        }
-
-        pmcf->nalloc++;
-
-        return perl;
-    }
-
-#endif
-
     perl = perl_alloc();
     if (perl == NULL) {
         ngx_log_error(NGX_LOG_ALERT, log, 0, "perl_alloc() failed");
@@ -826,7 +800,7 @@
 {
     ngx_http_perl_main_conf_t *pmcf = conf;
 
-#if (NGX_HAVE_PERL_CLONE || NGX_HAVE_PERL_MULTIPLICITY)
+#if (NGX_HAVE_PERL_MULTIPLICITY)
     ngx_conf_init_uint_value(pmcf->interp_max, 10);
 #else
     ngx_conf_init_uint_value(pmcf->interp_max, 1);
@@ -844,15 +818,13 @@
         }
     }
 
-#if !(NGX_HAVE_PERL_CLONE)
     ngx_http_perl_free_interpreter(pmcf, pmcf->perl);
-#endif
 
     return NGX_CONF_OK;
 }
 
 
-#if (NGX_HAVE_PERL_CLONE || NGX_HAVE_PERL_MULTIPLICITY)
+#if (NGX_HAVE_PERL_MULTIPLICITY)
 
 static void
 ngx_http_perl_cleanup_perl(void *data)
@@ -1113,7 +1085,7 @@
 static char *
 ngx_http_perl_interp_max_unsupported(ngx_conf_t *cf, void *post, void *data)
 {
-#if (NGX_HAVE_PERL_CLONE || NGX_HAVE_PERL_MULTIPLICITY)
+#if (NGX_HAVE_PERL_MULTIPLICITY)
 
     return NGX_CONF_OK;
 
Index: auto/lib/perl/conf
===================================================================
--- auto/lib/perl/conf	(revision 187)
+++ auto/lib/perl/conf	(working copy)
@@ -36,11 +36,7 @@
         echo " + perl interpreter multiplicity found"
     fi
 
-    if $NGX_PERL -V:useithreads | grep define > /dev/null; then
-        have=NGX_HAVE_PERL_CLONE . auto/have
-        echo " + perl_clone() found"
-
-    else
+    if $NGX_PERL -V:useithreads | grep undef > /dev/null; then
         # FreeBSD port wants to link with -pthread non-threaded perl
         ngx_perl_ldopts=`echo $ngx_perl_ldopts | sed 's/ -pthread//'`
     fi


More information about the nginx-ru mailing list