summaryrefslogtreecommitdiff
path: root/src/fccache.c
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2012-10-07 17:42:18 -0400
committerBehdad Esfahbod <behdad@behdad.org>2013-01-02 01:03:06 -0600
commitb8f238e49d7b7e1cff787c518cd4490b32039cca (patch)
treea636ddb5125a8036b4550e3ceb366935ca23bfb5 /src/fccache.c
parentb27a22aae9902d409c21e5bb19a97dcc5966ea24 (diff)
downloadfontconfig-b8f238e49d7b7e1cff787c518cd4490b32039cca.tar.gz
Make FcCacheIsMmapSafe() threadsafe
Diffstat (limited to 'src/fccache.c')
-rw-r--r--src/fccache.c38
1 files changed, 22 insertions, 16 deletions
diff --git a/src/fccache.c b/src/fccache.c
index aace6b3..19293e2 100644
--- a/src/fccache.c
+++ b/src/fccache.c
@@ -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',