From 0f30d227497418c6d3bef7d52244407e30454504 Mon Sep 17 00:00:00 2001 From: Kacper Date: Mon, 22 Dec 2025 23:27:56 +0100 Subject: Added c11 threads, fixed some locks and add *_unlocked functions --- lib/libc/stdio/fread.c | 56 +++++++------------------------------------------- 1 file changed, 7 insertions(+), 49 deletions(-) (limited to 'lib/libc/stdio/fread.c') diff --git a/lib/libc/stdio/fread.c b/lib/libc/stdio/fread.c index 443b4874..bcadbbdc 100644 --- a/lib/libc/stdio/fread.c +++ b/lib/libc/stdio/fread.c @@ -1,54 +1,12 @@ -#include "__stdio.h" // for __FILE, _IO_EOF, _IO_ERR +#include -#include // for LIBC_LOCK, LIBC_UNLOCK -#include // for fread, BUFSIZ, FILE -#include // for memcpy -#include // for size_t, read, ssize_t - -char __stdin_buffer[BUFSIZ]; - -size_t fread(void *restrict ptr, size_t size, size_t nitems, - FILE *restrict stream) +size_t fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream) { - if (size == 0 || nitems == 0) - return 0; - - size_t total = size * nitems; - size_t bytes_read = 0; - char *p = ptr; - - LIBC_LOCK(__FILE(stream)->lock); - - while (total > 0) { - if (__FILE(stream)->buf_pos < __FILE(stream)->buf_len) { - size_t available = __FILE(stream)->buf_len - - __FILE(stream)->buf_pos; - size_t to_copy = total < available ? total : available; - - memcpy(p, __FILE(stream)->buf + __FILE(stream)->buf_pos, - to_copy); - __FILE(stream)->buf_pos += to_copy; - p += to_copy; - bytes_read += to_copy; - total -= to_copy; - continue; - } - - ssize_t ret = read(__FILE(stream)->fd, __FILE(stream)->buf, - __FILE(stream)->buf_size); - if (ret <= 0) { - if (ret < 0) - __FILE(stream)->flags |= _IO_ERR; - else - __FILE(stream)->flags |= _IO_EOF; - break; - } - - __FILE(stream)->buf_len = ret; - __FILE(stream)->buf_pos = 0; - } + size_t r; - LIBC_UNLOCK(__FILE(stream)->lock); + flockfile(stream); + r = fread_unlocked(ptr, size, nitems, stream); + funlockfile(stream); - return bytes_read / size; + return r; } -- cgit v1.2.3