[Mesa-dev] [PATCH] util/disk_cache: pass predicate functions file stats directly
Grazvydas Ignotas
notasas at gmail.com
Sun Mar 12 21:57:05 UTC 2017
FWIW:
Reviewed-by: Grazvydas Ignotas <notasas at gmail.com>
On Sun, Mar 12, 2017 at 5:03 PM, Alan Swanson <reiver at improbability.net> wrote:
> Since switching to LRU eviction the only user of these predicate
> functions now resolves directory entry stats itself so pass them
> directly saving calling fstat and strlen twice (and the expensive
> strlen is skipped entirely if access time is newer).
> ---
> Depends on "util/disc_cache: use LRU eviction rather than random eviction" patch.
>
> src/util/disk_cache.c | 44 ++++++++++++++++----------------------------
> 1 file changed, 16 insertions(+), 28 deletions(-)
>
> diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c
> index be0f8822b6..bd223864f9 100644
> --- a/src/util/disk_cache.c
> +++ b/src/util/disk_cache.c
> @@ -453,8 +453,9 @@ make_cache_file_directory(struct disk_cache *cache, const cache_key key)
> */
> static char *
> choose_lru_file_matching(const char *dir_path,
> - bool (*predicate)(const struct dirent *,
> - const char *dir_path))
> + bool (*predicate)(const struct stat,
> + const char *,
> + const size_t))
> {
> DIR *dir;
> struct dirent *entry;
> @@ -470,13 +471,15 @@ choose_lru_file_matching(const char *dir_path,
> entry = readdir(dir);
> if (entry == NULL)
> break;
> - if (!predicate(entry, dir_path))
> - continue;
>
> struct stat sb;
> if (fstatat(dirfd(dir), entry->d_name, &sb, 0) == 0) {
> if (!lru_atime || (sb.st_atime < lru_atime)) {
> size_t len = strlen(entry->d_name) + 1;
> +
> + if (!predicate(sb, entry->d_name, len))
> + continue;
> +
> char *tmp = realloc(lru_name, len);
> if (tmp) {
> lru_name = tmp;
> @@ -505,21 +508,13 @@ choose_lru_file_matching(const char *dir_path,
> * ".tmp"
> */
> static bool
> -is_regular_non_tmp_file(const struct dirent *entry, const char *path)
> +is_regular_non_tmp_file(const struct stat sb, const char *d_name,
> + const size_t len)
> {
> - char *filename;
> - if (asprintf(&filename, "%s/%s", path, entry->d_name) == -1)
> - return false;
> -
> - struct stat sb;
> - int res = stat(filename, &sb);
> - free(filename);
> -
> - if (res == -1 || !S_ISREG(sb.st_mode))
> + if (!S_ISREG(sb.st_mode))
> return false;
>
> - size_t len = strlen (entry->d_name);
> - if (len >= 4 && strcmp(&entry->d_name[len-4], ".tmp") == 0)
> + if (len >= 4 && strcmp(&d_name[len-4], ".tmp") == 0)
> return false;
>
> return true;
> @@ -552,23 +547,16 @@ unlink_lru_file_from_directory(const char *path)
> * special name of "..")
> */
> static bool
> -is_two_character_sub_directory(const struct dirent *entry, const char *path)
> +is_two_character_sub_directory(const struct stat sb, const char *d_name,
> + const size_t len)
> {
> - char *subdir;
> - if (asprintf(&subdir, "%s/%s", path, entry->d_name) == -1)
> - return false;
> -
> - struct stat sb;
> - int res = stat(subdir, &sb);
> - free(subdir);
> -
> - if (res == -1 || !S_ISDIR(sb.st_mode))
> + if (!S_ISDIR(sb.st_mode))
> return false;
>
> - if (strlen(entry->d_name) != 2)
> + if (len != 2)
> return false;
>
> - if (strcmp(entry->d_name, "..") == 0)
> + if (strcmp(d_name, "..") == 0)
> return false;
>
> return true;
> --
> 2.11.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list