diff options
author | Anton Kling <anton@kling.gg> | 2024-10-03 14:21:12 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-10-03 14:21:12 +0200 |
commit | 64b0b49a1f23da9faa680f8158cb8a12cd4d118c (patch) | |
tree | ba165c5e9d66ed9534958fcf5c9a8a36061b7433 | |
parent | a8226de3e53937b579705586a16ccc884b8efb5d (diff) |
libc: Add readdir_multi
This is a faster, zero allocation function for reading directory
entries. It has massive speed increases for certain applications since
malloc(especially my implementation) is really slow in comparison.
-rw-r--r-- | include/dirent.h | 1 | ||||
-rw-r--r-- | userland/libc/dirent/readdir.c | 13 |
2 files changed, 14 insertions, 0 deletions
diff --git a/include/dirent.h b/include/dirent.h index dcd7f59..66e8e8f 100644 --- a/include/dirent.h +++ b/include/dirent.h @@ -34,5 +34,6 @@ int scandir_sane(const char *dir, struct dirent ***namelist, int (*compar)(const struct dirent **, const struct dirent **)); void scandir_sane_free(struct dirent **namelist); +int readdir_multi(DIR *dir, struct dirent *entries, int num_entries); #endif // KERNEL #endif // DIRENT_H diff --git a/userland/libc/dirent/readdir.c b/userland/libc/dirent/readdir.c index 8b825cb..9a9f8fa 100644 --- a/userland/libc/dirent/readdir.c +++ b/userland/libc/dirent/readdir.c @@ -1,6 +1,19 @@ #include <dirent.h> #include <unistd.h> +int readdir_multi(DIR *dir, struct dirent *entries, int num_entries) { + size_t offset = dir->dir_num * sizeof(struct dirent); + int rc; + if (-1 == (rc = pread(dir->fd, entries, num_entries * sizeof(struct dirent), + offset))) { + return -1; + } + + int num_read_entries = rc / sizeof(struct dirent); + dir->dir_num += num_read_entries; + return num_read_entries; +} + struct dirent *readdir(DIR *dir) { size_t offset = dir->dir_num * sizeof(struct dirent); int rc; |