[Mesa-dev] [PATCH 36/40] util/disk_cache: add support for removing old versions of the cache

Timothy Arceri tarceri at itsqueeze.com
Tue Feb 7 03:42:40 UTC 2017


---
 src/util/disk_cache.c | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c
index df511e4..da4eb47 100644
--- a/src/util/disk_cache.c
+++ b/src/util/disk_cache.c
@@ -24,6 +24,7 @@
 #ifdef ENABLE_SHADER_CACHE
 
 #include <ctype.h>
+#include <ftw.h>
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
@@ -131,6 +132,40 @@ concatenate_and_mkdir(void *ctx, char *path, const char *name)
       return NULL;
 }
 
+static int
+remove_dir(const char *fpath, const struct stat *sb,
+           int typeflag, struct FTW *ftwbuf)
+{
+   if (S_ISREG(sb->st_mode))
+      unlink(fpath);
+   else if (S_ISDIR(sb->st_mode))
+      rmdir(fpath);
+
+   return 0;
+}
+
+static void
+remove_old_cache_directories(void *mem_ctx, char *path,
+                             const char *mesa_version)
+{
+   DIR *dir = opendir(path);
+
+   struct dirent* d_entry;
+   while((d_entry = readdir(dir)) != NULL)
+   {
+      struct stat sb;
+      stat(d_entry->d_name, &sb);
+      if (S_ISDIR(sb.st_mode) &&
+          strcmp(d_entry->d_name, mesa_version) != 0 &&
+          strcmp(d_entry->d_name, "..") != 0 &&
+          strcmp(d_entry->d_name, ".") != 0) {
+         char *full_path =
+            ralloc_asprintf(mem_ctx, "%s/%s", path, d_entry->d_name);
+         nftw(full_path, remove_dir, 20, FTW_DEPTH);
+      }
+   }
+}
+
 static char *
 create_mesa_cache_dir(void *mem_ctx, char *path, const char *mesa_version,
                       const char *gpu_name)
@@ -139,6 +174,9 @@ create_mesa_cache_dir(void *mem_ctx, char *path, const char *mesa_version,
    if (new_path == NULL)
       return NULL;
 
+   /* Remove cache directories for old Mesa versions */
+   remove_old_cache_directories(mem_ctx, new_path, mesa_version);
+
    new_path = concatenate_and_mkdir(mem_ctx, new_path, mesa_version);
    if (new_path == NULL)
       return NULL;
-- 
2.9.3



More information about the mesa-dev mailing list