On Mon, Mar 6, 2017 at 6:17 PM, Alan Swanson <rei...@improbability.net> wrote: > Still using random selection of two-character subdirectory in which > to check cache files rather than scanning entire cache. > --- > src/util/disk_cache.c | 77 > +++++++++++++++++++++++---------------------------- > 1 file changed, 34 insertions(+), 43 deletions(-) > > diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c > index 31a9336582..28f8ea4054 100644 > --- a/src/util/disk_cache.c > +++ b/src/util/disk_cache.c > @@ -438,30 +438,30 @@ make_cache_file_directory(struct disk_cache *cache, > const cache_key key) > free(dir); > } > > -/* Given a directory path and predicate function, count all entries in > - * that directory for which the predicate returns true. Then choose a > - * random entry from among those counted. > +/* Given a directory path and predicate function, find the entry with > + * the oldest access time in that directory for which the predicate > + * returns true. > * > * Returns: A malloc'ed string for the path to the chosen file, (or > * NULL on any error). The caller should free the string when > * finished. > */ > static char * > -choose_random_file_matching(const char *dir_path, > - bool (*predicate)(const struct dirent *, > - const char *dir_path)) > +choose_lru_file_matching(const char *dir_path, > + bool (*predicate)(const struct dirent *, > + const char *dir_path)) > { > DIR *dir; > struct dirent *entry; > - unsigned int count, victim; > + struct stat sb; > + char *tmp, *lru_name = NULL; > + time_t lru_atime = 0; > char *filename; > > dir = opendir(dir_path); > if (dir == NULL) > return NULL; > > - count = 0; > - > while (1) { > entry = readdir(dir); > if (entry == NULL) > @@ -469,39 +469,28 @@ choose_random_file_matching(const char *dir_path, > if (!predicate(entry, dir_path)) > continue; > > - count++; > - } > - > - if (count == 0) { > - closedir(dir); > - return NULL; > - } > - > - victim = rand() % count; > - > - rewinddir(dir); > - count = 0; > - > - while (1) { > - entry = readdir(dir); > - if (entry == NULL) > - break; > - if (!predicate(entry, dir_path)) > - continue; > - if (count == victim) > - break; > - > - count++; > + if (fstatat(dirfd(dir), entry->d_name, &sb, 0) == 0) { > + if (!lru_atime || (sb.st_atime < lru_atime)) { > + tmp = realloc(lru_name, strlen(entry->d_name) + 1); > + if (tmp) { > + lru_name = tmp; > + memcpy(lru_name, entry->d_name, > + strlen(entry->d_name) + 1);
Maybe avoid the double strlen()? Either way, FWIW: Reviewed-by: Grazvydas Ignotas <nota...@gmail.com> GraÅžvydas _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev