[Mesa-dev] [PATCH 2/5] util/disk_cache: don't fallback to an empty cache dir on evict
Timothy Arceri
tarceri at itsqueeze.com
Tue Mar 14 02:08:09 UTC 2017
If we fail to randomly select a two letter cache dir, don't select
an empty dir on fallback.
In real world use we should never hit the fallback path but it can
be hit by tests when the cache is set to a very small max value.
---
src/util/disk_cache.c | 33 +++++++++++++++++++++++++++------
1 file changed, 27 insertions(+), 6 deletions(-)
diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c
index dc65d52..5b4f12b 100644
--- a/src/util/disk_cache.c
+++ b/src/util/disk_cache.c
@@ -577,47 +577,68 @@ unlink_random_file_from_directory(const char *path)
filename = choose_random_file_matching(path, is_regular_non_tmp_file);
if (filename == NULL)
return 0;
if (stat(filename, &sb) == -1) {
free (filename);
return 0;
}
unlink(filename);
-
free (filename);
return sb.st_size;
}
/* Is entry a directory with a two-character name, (and not the
- * special name of "..")
+ * 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)
{
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)) {
+ free(subdir);
+ return false;
+ }
- if (res == -1 || !S_ISDIR(sb.st_mode))
+ if (strlen(entry->d_name) != 2) {
+ free(subdir);
return false;
+ }
- if (strlen(entry->d_name) != 2)
+ if (strcmp(entry->d_name, "..") == 0) {
+ free(subdir);
return false;
+ }
+
+ DIR *dir = opendir(subdir);
+ free(subdir);
+
+ if (dir == NULL)
+ return false;
+
+ unsigned subdir_entries = 0;
+ struct dirent *d;
+ while ((d = readdir(dir)) != NULL) {
+ if(++subdir_entries > 2)
+ break;
+ }
+ closedir(dir);
- if (strcmp(entry->d_name, "..") == 0)
+ /* If dir only contains '.' and '..' it must be empty */
+ if (subdir_entries <= 2)
return false;
return true;
}
static void
evict_random_item(struct disk_cache *cache)
{
const char hex[] = "0123456789abcde";
char *dir_path;
--
2.9.3
More information about the mesa-dev
mailing list