diff options
| author | Kacper <kacper@mail.openlinux.dev> | 2025-12-22 23:27:56 +0100 |
|---|---|---|
| committer | Kacper <kacper@mail.openlinux.dev> | 2025-12-22 23:30:32 +0100 |
| commit | 0f30d227497418c6d3bef7d52244407e30454504 (patch) | |
| tree | 0e1ac19623d3268380cf74328cdf643648a2f43c /lib/libc/stdio/fread.c | |
| parent | 90dad97fc07f049383903a166631e2c257f9b8c1 (diff) | |
Added c11 threads, fixed some locks and add *_unlocked functions
Diffstat (limited to 'lib/libc/stdio/fread.c')
| -rw-r--r-- | lib/libc/stdio/fread.c | 56 |
1 files changed, 7 insertions, 49 deletions
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 <stdio.h> -#include <atomic.h> // for LIBC_LOCK, LIBC_UNLOCK -#include <stdio.h> // for fread, BUFSIZ, FILE -#include <string.h> // for memcpy -#include <unistd.h> // 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; } |
