util/disk_cache: support caches for multiple architectures
authorTimothy Arceri <tarceri@itsqueeze.com>
Sat, 4 Mar 2017 21:07:22 +0000 (08:07 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Sun, 5 Mar 2017 22:27:01 +0000 (09:27 +1100)
Previously we were deleting the entire cache if a user switched
between 32 and 64 bit applications.

V2: make the check more generic, it should now work with any
platform we are likely to support.

V3: Use suggestion from Emil to make even more generic/fix issue
with __ILP32__ not being declared on gcc for regular 32-bit builds.

Tested-by: Grazvydas Ignotas <notasas@gmail.com>
Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
src/util/disk_cache.c

index 198d90e4222553298dd2f74a4d73ff0c7eda44fb..7f249399e0dfab73a1f2b6e32795171e3a37c66f 100644 (file)
@@ -74,6 +74,23 @@ struct disk_cache {
    uint64_t max_size;
 };
 
+static const char *
+get_arch_bitness_str(void)
+{
+    if (sizeof(void *) == 4)
+#ifdef __ILP32__
+        return "ilp-32";
+#else
+        return "32";
+#endif
+    if (sizeof(void *) == 8)
+        return "64";
+
+    /* paranoia check which will be dropped by the optimiser */
+    assert(!"unknown_arch");
+    return "unknown_arch";
+}
+
 /* Create a directory named 'path' if it does not already exist.
  *
  * Returns: 0 if path already exists as a directory or if created.
@@ -178,6 +195,15 @@ create_mesa_cache_dir(void *mem_ctx, const char *path, const char *timestamp,
    if (new_path == NULL)
       return NULL;
 
+   /* Create a parent architecture directory so that we don't remove cache
+    * files for other architectures. In theory we could share the cache
+    * between architectures but we have no way of knowing if they were created
+    * by a compatible Mesa version.
+    */
+   new_path = concatenate_and_mkdir(mem_ctx, new_path, get_arch_bitness_str());
+   if (new_path == NULL)
+      return NULL;
+
    /* Remove cache directories for old Mesa versions */
    remove_old_cache_directories(mem_ctx, new_path, timestamp);