1
0
mirror of https://github.com/adtools/clib2.git synced 2026-05-03 02:35:20 +00:00

Documented why bypassing the read/write buffer is only attempted if there is at least a full buffer worth of data to be read or written.

This commit is contained in:
obarthel
2023-09-14 09:52:21 +02:00
parent f5631d8bda
commit d37909e409
2 changed files with 10 additions and 8 deletions

View File

@@ -108,6 +108,7 @@ fread(void *ptr,size_t element_size,size_t count,FILE *stream)
size_t total_bytes_read = 0;
size_t total_size;
unsigned char * data = ptr;
ssize_t num_bytes_read;
int c;
if (__fgetc_check((FILE *)file) < 0)
@@ -123,8 +124,6 @@ fread(void *ptr,size_t element_size,size_t count,FILE *stream)
/* No buffering enabled? */
if ((file->iob_Flags & IOBF_BUFFER_MODE) == IOBF_BUFFER_MODE_NONE)
{
ssize_t num_bytes_read;
/* We bypass the buffer entirely. */
num_bytes_read = read(file->iob_Descriptor, data, total_size);
if (num_bytes_read == -1)
@@ -142,13 +141,13 @@ fread(void *ptr,size_t element_size,size_t count,FILE *stream)
{
while (total_size > 0)
{
/* If there is more data to be read and the read buffer is empty
* anyway, we'll bypass the buffer entirely.
/* If the read buffer is empty and there is more data to be
* read, we'll bypass the buffer entirely. Note that we try
* to read a complete full buffer worth's of data, not just
* a few bytes.
*/
if (file->iob_BufferReadBytes == 0 && total_size >= (size_t)file->iob_BufferSize)
{
ssize_t num_bytes_read;
/* We bypass the buffer entirely. */
num_bytes_read = read(file->iob_Descriptor, data, total_size);
if (num_bytes_read == -1)

View File

@@ -183,7 +183,9 @@ fwrite(const void *ptr,size_t element_size,size_t count,FILE *stream)
file->iob_BufferWriteBytes += num_buffer_bytes;
/* Write the buffer to disk if it's full or contains a line feed. */
/* Write the buffer to disk if the buffer is full
* or contains a line feed.
*/
if ((lf != NULL || __iob_write_buffer_is_full(file)) && __flush_iob_write_buffer(file) < 0)
{
/* Abort with error. */
@@ -237,7 +239,8 @@ fwrite(const void *ptr,size_t element_size,size_t count,FILE *stream)
{
/* If there is more data to be written than the write buffer will hold
* and the write buffer is empty anyway, then we'll bypass the write
* buffer entirely.
* buffer entirely. Note that we try to store a complete full buffer
* worth's of data, not just a few bytes.
*/
if (file->iob_BufferWriteBytes == 0 && total_size >= (size_t)file->iob_BufferSize)
{