On Sat, Dec 15, 2018 at 09:15:14PM -0700, Todd C. Miller wrote:
> On Fri, 14 Dec 2018 10:49:23 -0700, "Todd C. Miller" wrote:
> 
> > After thinking about this a bit more I believe it best to just use
> > the existing FILE * and swap in the buffer temporarily.  There's
> > no need to store the value of the old buffer; since we are unbuffered
> > it can only point to _nbuf.
> 
> The last diff had a bug.  It turns out that __srefill() assumes it
> has the entire buffer to use so we need to reset the buffer each
> time we call it.

Sorry to have missed it while I reviewed the previous diff. Adjusting
the buffer pointer/size at each time is the right thing to do.

ok semarie@
 
> This fixes the problem naddy@ saw with a few of the ports in python
> code.
> 
>  - todd
> 
> Index: lib/libc/stdio/fread.c
> ===================================================================
> RCS file: /cvs/src/lib/libc/stdio/fread.c,v
> retrieving revision 1.18
> diff -u -p -u -r1.18 fread.c
> --- lib/libc/stdio/fread.c    16 Dec 2018 03:40:40 -0000      1.18
> +++ lib/libc/stdio/fread.c    16 Dec 2018 04:12:32 -0000
> @@ -68,6 +68,36 @@ fread(void *buf, size_t size, size_t cou
>               fp->_r = 0;
>       total = resid;
>       p = buf;
> +
> +     /*
> +      * If we're unbuffered we know that the buffer in fp is empty so
> +      * we can read directly into buf.  This is much faster than a
> +      * series of one byte reads into fp->_nbuf.
> +      */
> +     if ((fp->_flags & __SNBF) != 0 && buf != NULL) {
> +             while (resid > 0) {
> +                     /* set up the buffer */
> +                     fp->_bf._base = fp->_p = p;
> +                     fp->_bf._size = resid;
> +
> +                     if (__srefill(fp)) {
> +                             /* no more input: return partial result */
> +                             count = (total - resid) / size;
> +                             break;
> +                     }
> +                     p += fp->_r;
> +                     resid -= fp->_r;
> +             }
> +
> +             /* restore the old buffer (see __smakebuf) */
> +             fp->_bf._base = fp->_p = fp->_nbuf;
> +             fp->_bf._size = 1;
> +             fp->_r = 0;
> +
> +             FUNLOCKFILE(fp);
> +             return (count);
> +     }
> +
>       while (resid > (r = fp->_r)) {
>               (void)memcpy(p, fp->_p, r);
>               fp->_p += r;

-- 
Sebastien Marie

Reply via email to