[Mesa-dev] [PATCH 1/3] util/disk_cache: use LRU eviction rather than random eviction (v2)

Grazvydas Ignotas notasas at gmail.com
Fri Mar 10 10:51:25 UTC 2017


On Fri, Mar 10, 2017 at 6:23 AM, Timothy Arceri <tarceri at itsqueeze.com> wrote:
> On 07/03/17 12:25, Alan Swanson wrote:
>>
>> Still using random selection of two-character subdirectory in which
>> to check cache files rather than scanning entire cache.
>>
>> v2: Factor out double strlen call
>> ---
>>  src/util/disk_cache.c | 78
>> +++++++++++++++++++++++----------------------------
>>  1 file changed, 35 insertions(+), 43 deletions(-)
>>
>> diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c
>> index 31a9336582..2a923be3dc 100644
>> --- a/src/util/disk_cache.c
>> +++ b/src/util/disk_cache.c
>> @@ -438,70 +438,60 @@ 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;
>> +   size_t len;
>> +   time_t lru_atime = 0;
>
>
> Please try to declare variables where they are used. The original version of
> this file was written before we could use C99 features in Mesa.
>
>
>
>>     char *filename;
>>
>>     dir = opendir(dir_path);
>>     if (dir == NULL)
>>        return NULL;
>>
>> -   count = 0;
>> -
>> -   while (1) {
>> -      entry = readdir(dir);
>> -      if (entry == NULL)
>> -         break;
>> -      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)) {
>> +            len = strlen(entry->d_name) + 1;
>> +            tmp = realloc(lru_name, len);
>> +            if (tmp) {
>> +               lru_name = tmp;
>
>
> I don't think we need tmp here. Why not use lru_name directly?

It *is* needed, otherwise if realloc fails, you'll leak old memory.

GraÅžvydas


More information about the mesa-dev mailing list