accept4 should be used in nginx( linux platform)
Maxim Dounin
mdounin at mdounin.ru
Sun Nov 7 20:34:44 MSK 2010
Hello!
On Mon, Nov 08, 2010 at 12:33:04AM +0800, BoBo wrote:
> this patch suit for nginx-0.8.53, and i test in my arch linux. Thanks.
>
> diff -Naur nginx-0.8.53/auto/os/features
> nginx-0.8.53_accpet4/auto/os/features
> --- nginx-0.8.53/auto/os/features 2010-07-05 21:49:16.000000000 +0800
> +++ nginx-0.8.53_accpet4/auto/os/features 2010-11-08 00:20:28.126666705
> +0800
> @@ -352,3 +352,12 @@
> fi
> fi
> fi
> +
> +ngx_feature="accept4()"
> +ngx_feature_name="NGX_HAVE_ACCEPT4"
> +ngx_feature_run=no
> +ngx_feature_incs="#include <sys/socket.h>"
> +ngx_feature_path=
> +ngx_feature_libs=
> +ngx_feature_test="accept4(0, NULL, NULL, SOCK_NONBLOCK)"
> +. auto/feature
What happens when host has new glibc but old kernel? I assume
this test would succeed, but accept4() call will fail with ENOSYS.
Another question to consider is what to do with packages built on
host with accept4() but used on hosts without. Probably some
runtime fallback to usual accept() is needed.
> diff -Naur nginx-0.8.53/src/event/ngx_event_accept.c
> nginx-0.8.53_accpet4/src/event/ngx_event_accept.c
> --- nginx-0.8.53/src/event/ngx_event_accept.c 2009-11-02 03:29:49.000000000
> +0800
> +++ nginx-0.8.53_accpet4/src/event/ngx_event_accept.c 2010-11-08
> 00:27:21.630000043 +0800
> @@ -45,8 +45,12 @@
>
> do {
> socklen = NGX_SOCKADDRLEN;
> -
> +
> +#if (NGX_HAVE_ACCEPT4)
> + s = accept4(lc->fd, (struct sockaddr *) sa, &socklen,
> SOCK_NONBLOCK);
> +#else
> s = accept(lc->fd, (struct sockaddr *) sa, &socklen);
> +#endif
>
> if (s == -1) {
> err = ngx_socket_errno;
> @@ -115,9 +119,9 @@
> ngx_close_accepted_connection(c);
> return;
> }
> -
> +
Stray -/+ probably indicate some unrelated whitespace changes
(though patch seems to be corrupted by MUA anyway).
> +#ifndef NGX_HAVE_ACCEPT4
> /* set a blocking mode for aio and non-blocking mode for others */
> -
> if (ngx_inherited_nonblocking) {
> if (ngx_event_flags & NGX_USE_AIO_EVENT) {
> if (ngx_blocking(s) == -1) {
> @@ -138,7 +142,8 @@
> }
> }
> }
> -
> +#endif
This part is wrong: with socket AIO sockets should be set to
blocking mode. The same code path as with
ngx_inherited_nonblocking should be followed.
Maxim Dounin
More information about the nginx
mailing list