[dev] synchronous write

Igor Sysoev is at rambler-co.ru
Mon Oct 22 14:40:12 MSD 2007


On Mon, Oct 22, 2007 at 12:17:33PM +0200, Manlio Perillo wrote:

> Igor Sysoev ha scritto:
> >[...]
> >
> >>Igor, do you thing that setting temporarily the socket to blocking mode 
> >>can be a solution?
> >>
> >>    out.buf = b;
> >>    out.next = NULL;
> >>
> >>    b->pos = data;
> >>    b->last = data + len;
> >>
> >>    b->memory = 1;
> >>    b->flush = 1;
> >>
> >>    ngx_blocking(self->r->connection->fd);
> >>    rc = ngx_http_output_filter(self->r, &out);
> >>    ngx_nonblocking(self->r->connection->fd);
> >>
> >>
> >>I have done some tests and it seems to work.
> >
> >No, this completely kill the idea of nginx - a worker will be blocked.
> >
> 
> Unfortunately this is required by the WSGI spec, and some "legacy" WSGI 
> applications will block the worker, anyway.
> 
> I have implemented an alternative version that uses a buffer, but I 
> would like to know if using this "hack" is "safe", that is if Nginx will 
> send the correct data to the client and if after setting again the 
> socket to nonblocking mode, Nginx will work as usual.

Yes, it will work. However, you should use the following cycle:

    ngx_blocking(self->r->connection->fd);

    do {
        rc = ngx_http_output_filter(self->r, &out);
    } while (rc == NGX_AGAIN);

    ngx_nonblocking(self->r->connection->fd);


-- 
Igor Sysoev
http://sysoev.ru/en/





More information about the nginx mailing list