[Mesa-dev] [PATCH] util/disk_cache: pass predicate functions file stats directly (v3)

Grazvydas Ignotas notasas at gmail.com
Fri Mar 17 00:17:52 UTC 2017


On Thu, Mar 16, 2017 at 7:36 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).
>
> v2: Update for empty cache dir detection changes
> v3: Fix passing string length to predicate with the +1 for NULL
>     termination and also pass sb as pointer
> ---
> That +1 was embarrassingly careless. Thanks for catching.

Now it doesn't seem to compile, sent some wrong version?

GraÅžvydas

>
>  src/util/disk_cache.c | 55 ++++++++++++++++++++-------------------------------
>  1 file changed, 21 insertions(+), 34 deletions(-)
>
> diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c
> index e015e56f5e..c2ed58047a 100644
> --- a/src/util/disk_cache.c
> +++ b/src/util/disk_cache.c
> @@ -481,8 +481,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 char *dir_path,
> +                                           const struct stat *,
> +                                           const char *, const size_t))
>  {
>     DIR *dir;
>     struct dirent *entry;
> @@ -498,17 +499,19 @@ 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;
> -            char *tmp = realloc(lru_name, len);
> +            size_t len = strlen(entry->d_name);
> +
> +            if (!predicate(dir_path, sb, entry->d_name, len))
> +               continue;
> +
> +            char *tmp = realloc(lru_name, len + 1);
>              if (tmp) {
>                 lru_name = tmp;
> -               memcpy(lru_name, entry->d_name, len);
> +               memcpy(lru_name, entry->d_name, len + 1);
>                 lru_atime = sb.st_atime;
>              }
>           }
> @@ -533,21 +536,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 char *path, 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;
> @@ -579,29 +574,21 @@ unlink_lru_file_from_directory(const char *path)
>   * special name of ".."). We also return false if the dir is empty.
>   */
>  static bool
> -is_two_character_sub_directory(const struct dirent *entry, const char *path)
> +is_two_character_sub_directory(const char *path, const struct stat *sb,
> +                               const char *d_name, const size_t len)
>  {
> -   char *subdir;
> -   if (asprintf(&subdir, "%s/%s", path, entry->d_name) == -1)
> +   if (!S_ISDIR(sb->st_mode))
>        return false;
>
> -   struct stat sb;
> -   int res = stat(subdir, &sb);
> -   if (res == -1 || !S_ISDIR(sb.st_mode)) {
> -      free(subdir);
> +   if (len != 2)
>        return false;
> -   }
>
> -   if (strlen(entry->d_name) != 2) {
> -      free(subdir);
> +   if (strcmp(d_name, "..") == 0)
>        return false;
> -   }
>
> -   if (strcmp(entry->d_name, "..") == 0) {
> -      free(subdir);
> +   char *subdir;
> +   if (asprintf(&subdir, "%s/%s", path, d_name) == -1)
>        return false;
> -   }
> -
>     DIR *dir = opendir(subdir);
>     free(subdir);
>
> --
> 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