apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jim Jagielski <...@jagunet.com>
Subject Re: sendfile in darwin
Date Wed, 07 May 2008 18:42:51 GMT

On May 7, 2008, at 2:31 PM, Dirk-Willem van Gulik wrote:

> Hmm - Jim - that does not quite solve the issue I was discussing on  
> IRC;

On IRC? What happened to onlist discussions?? :)

> I think below is needed (which does solve the TimeOut issue).
>
> --> diff with your version -- anticipate nbytes set to 0 (which has  
> whole file semantics on BSD and Darwin).
>
> Does that make sense ?
>

This looks like a patch on something that already patches
things... so I can't comment on whether this makes sense since
it includes a patch which I have no clue about.

The addition of 'rv = 0' though on line ~453 is almost
for sure wrong...

>
> Dw
>
> Index: network_io/unix/sendrecv.c
> ===================================================================
> --- network_io/unix/sendrecv.c	(revision 648693)
> +++ network_io/unix/sendrecv.c	(working copy)
> @@ -438,6 +438,7 @@
>             }
>         }
>         if (nbytes) {
> +	    int nnbytes = nbytes;
>             /* We won't dare call sendfile() if we don't have
>              * header or file bytes to send because nbytes == 0
>              * means send the remaining file to EOF.
> @@ -445,7 +446,7 @@
>             rv = sendfile(file->filedes, /* file to be sent */
>                           sock->socketdes, /* socket */
>                           *offset,       /* where in the file to  
> start */
> -                          &nbytes,       /* number of bytes to  
> write/written */
> +                          &nnbytes,       /* number of bytes to  
> write/written */
>                           &headerstruct, /* Headers/footers */
>                           flags);        /* undefined, set to 0 */
>
> @@ -453,12 +454,13 @@
>                 if (errno == EAGAIN) {
>                     if (sock->timeout > 0) {
>                         sock->options |= APR_INCOMPLETE_WRITE;
> +			rv = 0;
>                     }
>                     /* BSD's sendfile can return -1/EAGAIN even if it
>                      * sent bytes.  Sanitize the result so we get  
> normal EAGAIN
>                      * semantics w.r.t. bytes sent.
>                      */
> -                    if (nbytes) {
> +                    if (nnbytes) {
>                         /* normal exit for a big file & non-blocking  
> io */
>                         (*len) = nbytes;
>                         return APR_SUCCESS;
> @@ -466,7 +468,7 @@
>                 }
>             }
>             else {       /* rv == 0 (or the kernel is broken) */
> -                if (nbytes == 0) {
> +                if (nnbytes == 0) {
>                     /* Most likely the file got smaller after the  
> stat.
>                      * Return an error so the caller can do the  
> Right Thing.
>                      */
>
>


Mime
View raw message