* libc/stdio/fvwrite.c: Allow writing in larger chunks for fully
buffered and unbuffered files, to improve write performance.
This commit is contained in:
parent
5b312b4747
commit
2a98b3363e
|
@ -1,3 +1,8 @@
|
||||||
|
2013-11-04 Terraneo Federico <fede.tft@hotmail.it>
|
||||||
|
|
||||||
|
* libc/stdio/fvwrite.c: Allow writing in larger chunks for fully
|
||||||
|
buffered and unbuffered files, to improve write performance.
|
||||||
|
|
||||||
2013-10-31 Terraneo Federico <fede.tft@hotmail.it>
|
2013-10-31 Terraneo Federico <fede.tft@hotmail.it>
|
||||||
|
|
||||||
* libc/stdio/fvwrite.h: change type of uio_resid from int to size_t to
|
* libc/stdio/fvwrite.h: change type of uio_resid from int to size_t to
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
#include "local.h"
|
#include "local.h"
|
||||||
#include "fvwrite.h"
|
#include "fvwrite.h"
|
||||||
|
|
||||||
|
@ -89,12 +90,14 @@ _DEFUN(__sfvwrite_r, (ptr, fp, uio),
|
||||||
if (fp->_flags & __SNBF)
|
if (fp->_flags & __SNBF)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Unbuffered: write up to BUFSIZ bytes at a time.
|
* Unbuffered: Split buffer in the largest multiple of BUFSIZ < INT_MAX
|
||||||
|
* as some legacy code may expect int instead of size_t.
|
||||||
*/
|
*/
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
GETIOV (;);
|
GETIOV (;);
|
||||||
w = fp->_write (ptr, fp->_cookie, p, MIN (len, BUFSIZ));
|
w = fp->_write (ptr, fp->_cookie, p,
|
||||||
|
MIN (len, INT_MAX - INT_MAX % BUFSIZ));
|
||||||
if (w <= 0)
|
if (w <= 0)
|
||||||
goto err;
|
goto err;
|
||||||
p += w;
|
p += w;
|
||||||
|
@ -177,29 +180,23 @@ _DEFUN(__sfvwrite_r, (ptr, fp, uio),
|
||||||
fp->_p += w;
|
fp->_p += w;
|
||||||
w = len; /* but pretend copied all */
|
w = len; /* but pretend copied all */
|
||||||
}
|
}
|
||||||
else if (fp->_p > fp->_bf._base && len > w)
|
else if (fp->_p > fp->_bf._base || len < fp->_bf._size)
|
||||||
{
|
{
|
||||||
/* fill and flush */
|
/* pass through the buffer */
|
||||||
|
w = MIN (len, w);
|
||||||
COPY (w);
|
COPY (w);
|
||||||
/* fp->_w -= w; *//* unneeded */
|
fp->_w -= w;
|
||||||
fp->_p += w;
|
fp->_p += w;
|
||||||
if (_fflush_r (ptr, fp))
|
if (fp->_w == 0 && _fflush_r (ptr, fp))
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
else if (len >= (w = fp->_bf._size))
|
|
||||||
{
|
|
||||||
/* write directly */
|
|
||||||
w = fp->_write (ptr, fp->_cookie, p, w);
|
|
||||||
if (w <= 0)
|
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* fill and done */
|
/* write directly */
|
||||||
w = len;
|
w = ((int)MIN (len, INT_MAX)) / fp->_bf._size * fp->_bf._size;
|
||||||
COPY (w);
|
w = fp->_write (ptr, fp->_cookie, p, w);
|
||||||
fp->_w -= w;
|
if (w <= 0)
|
||||||
fp->_p += w;
|
goto err;
|
||||||
}
|
}
|
||||||
p += w;
|
p += w;
|
||||||
len -= w;
|
len -= w;
|
||||||
|
|
Loading…
Reference in New Issue