Make FcCacheIsMmapSafe() threadsafe
authorBehdad Esfahbod <behdad@behdad.org>
Sun, 7 Oct 2012 21:42:18 +0000 (17:42 -0400)
committerBehdad Esfahbod <behdad@behdad.org>
Wed, 2 Jan 2013 07:03:06 +0000 (01:03 -0600)
src/fccache.c

index aace6b3..19293e2 100644 (file)
@@ -59,26 +59,32 @@ static void MD5Transform(FcChar32 buf[4], FcChar32 in[16]);
 static FcBool
 FcCacheIsMmapSafe (int fd)
 {
-    static FcBool is_initialized = FcFalse;
-    static FcBool is_env_available = FcFalse;
-    static FcBool use_mmap = FcFalse;
+    enum {
+      MMAP_NOT_INITIALIZED = 0,
+      MMAP_USE,
+      MMAP_DONT_USE,
+      MMAP_CHECK_FS,
+    } status;
+    static void *static_status;
 
-    if (!is_initialized)
-    {
-       const char *env;
+    status = (intptr_t) fc_atomic_ptr_get (&static_status);
 
-       env = getenv ("FONTCONFIG_USE_MMAP");
-       if (env)
-       {
-           if (FcNameBool ((const FcChar8 *)env, &use_mmap))
-               is_env_available = FcTrue;
-       }
-       is_initialized = FcTrue;
+    if (status == MMAP_NOT_INITIALIZED)
+    {
+       const char *env = getenv ("FONTCONFIG_USE_MMAP");
+       FcBool use;
+       if (env && FcNameBool ((const FcChar8 *) env, &use))
+           status =  use ? MMAP_USE : MMAP_DONT_USE;
+       else
+           status = MMAP_CHECK_FS;
+       fc_atomic_ptr_cmpexch (&static_status, NULL, (void *) status);
     }
-    if (is_env_available)
-       return use_mmap;
 
-    return FcIsFsMmapSafe (fd);
+    if (status == MMAP_CHECK_FS)
+       return FcIsFsMmapSafe (fd);
+    else
+       return status == MMAP_USE;
+
 }
 
 static const char bin2hex[] = { '0', '1', '2', '3',