diff options
author | Behdad Esfahbod <behdad@behdad.org> | 2012-10-07 17:42:18 -0400 |
---|---|---|
committer | Behdad Esfahbod <behdad@behdad.org> | 2013-01-02 01:03:06 -0600 |
commit | b8f238e49d7b7e1cff787c518cd4490b32039cca (patch) | |
tree | a636ddb5125a8036b4550e3ceb366935ca23bfb5 /src/fccache.c | |
parent | b27a22aae9902d409c21e5bb19a97dcc5966ea24 (diff) | |
download | fontconfig-b8f238e49d7b7e1cff787c518cd4490b32039cca.tar.gz |
Make FcCacheIsMmapSafe() threadsafe
Diffstat (limited to 'src/fccache.c')
-rw-r--r-- | src/fccache.c | 38 |
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', |