Lock the cache file until scanning and writing finished. (#1236034)
This commit is contained in:
parent
17d3f99b1a
commit
2f41965718
145
fontconfig-lock-cache.patch
Normal file
145
fontconfig-lock-cache.patch
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
diff --git a/src/fccache.c b/src/fccache.c
|
||||||
|
index fc3ed41..5a8720b 100644
|
||||||
|
--- a/src/fccache.c
|
||||||
|
+++ b/src/fccache.c
|
||||||
|
@@ -1142,6 +1142,70 @@ FcDirCacheClean (const FcChar8 *cache_dir, FcBool verbose)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+int
|
||||||
|
+FcDirCacheLock (const FcChar8 *dir,
|
||||||
|
+ FcConfig *config)
|
||||||
|
+{
|
||||||
|
+ FcChar8 *cache_hashed = NULL;
|
||||||
|
+ FcChar8 cache_base[CACHEBASE_LEN];
|
||||||
|
+ FcStrList *list;
|
||||||
|
+ FcChar8 *cache_dir;
|
||||||
|
+ const FcChar8 *sysroot = FcConfigGetSysRoot (config);
|
||||||
|
+ int fd = -1;
|
||||||
|
+
|
||||||
|
+ FcDirCacheBasename (dir, cache_base);
|
||||||
|
+ list = FcStrListCreate (config->cacheDirs);
|
||||||
|
+ if (!list)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ while ((cache_dir = FcStrListNext (list)))
|
||||||
|
+ {
|
||||||
|
+ if (sysroot)
|
||||||
|
+ cache_hashed = FcStrBuildFilename (sysroot, cache_dir, cache_base, NULL);
|
||||||
|
+ else
|
||||||
|
+ cache_hashed = FcStrBuildFilename (cache_dir, cache_base, NULL);
|
||||||
|
+ if (!cache_hashed)
|
||||||
|
+ break;
|
||||||
|
+ fd = FcOpen ((const char *)cache_hashed, O_RDWR);
|
||||||
|
+ /* No caches in that directory. simply retry with another one */
|
||||||
|
+ if (fd != -1)
|
||||||
|
+ {
|
||||||
|
+ struct flock fl;
|
||||||
|
+
|
||||||
|
+ fl.l_type = F_WRLCK;
|
||||||
|
+ fl.l_whence = SEEK_SET;
|
||||||
|
+ fl.l_start = 0;
|
||||||
|
+ fl.l_len = 0;
|
||||||
|
+ fl.l_pid = getpid ();
|
||||||
|
+ if (fcntl (fd, F_SETLKW, &fl) == -1)
|
||||||
|
+ goto bail;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return fd;
|
||||||
|
+bail:
|
||||||
|
+ if (fd != -1)
|
||||||
|
+ close (fd);
|
||||||
|
+ return -1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+FcDirCacheUnlock (int fd)
|
||||||
|
+{
|
||||||
|
+ struct flock fl;
|
||||||
|
+
|
||||||
|
+ if (fd != -1)
|
||||||
|
+ {
|
||||||
|
+ fl.l_type = F_UNLCK;
|
||||||
|
+ fl.l_whence = SEEK_SET;
|
||||||
|
+ fl.l_start = 0;
|
||||||
|
+ fl.l_len = 0;
|
||||||
|
+ fl.l_pid = getpid ();
|
||||||
|
+ fcntl (fd, F_SETLK, &fl);
|
||||||
|
+ close (fd);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Hokey little macro trick to permit the definitions of C functions
|
||||||
|
* with the same name as CPP macros
|
||||||
|
diff --git a/src/fcdir.c b/src/fcdir.c
|
||||||
|
index 2e7f0dc..f4807dd 100644
|
||||||
|
--- a/src/fcdir.c
|
||||||
|
+++ b/src/fcdir.c
|
||||||
|
@@ -332,6 +332,7 @@ FcDirCacheScan (const FcChar8 *dir, FcConfig *config)
|
||||||
|
struct stat dir_stat;
|
||||||
|
const FcChar8 *sysroot = FcConfigGetSysRoot (config);
|
||||||
|
FcChar8 *d;
|
||||||
|
+ int fd = -1;
|
||||||
|
|
||||||
|
if (sysroot)
|
||||||
|
d = FcStrBuildFilename (sysroot, dir, NULL);
|
||||||
|
@@ -352,6 +353,7 @@ FcDirCacheScan (const FcChar8 *dir, FcConfig *config)
|
||||||
|
if (!dirs)
|
||||||
|
goto bail1;
|
||||||
|
|
||||||
|
+ fd = FcDirCacheLock (dir, config);
|
||||||
|
/*
|
||||||
|
* Scan the dir
|
||||||
|
*/
|
||||||
|
@@ -371,6 +373,7 @@ FcDirCacheScan (const FcChar8 *dir, FcConfig *config)
|
||||||
|
FcDirCacheWrite (cache, config);
|
||||||
|
|
||||||
|
bail2:
|
||||||
|
+ FcDirCacheUnlock (fd);
|
||||||
|
FcStrSetDestroy (dirs);
|
||||||
|
bail1:
|
||||||
|
FcFontSetDestroy (set);
|
||||||
|
@@ -389,6 +392,7 @@ FcDirCacheRescan (const FcChar8 *dir, FcConfig *config)
|
||||||
|
FcStrSet *dirs;
|
||||||
|
const FcChar8 *sysroot = FcConfigGetSysRoot (config);
|
||||||
|
FcChar8 *d = NULL;
|
||||||
|
+ int fd = -1;
|
||||||
|
|
||||||
|
cache = FcDirCacheLoad (dir, config, NULL);
|
||||||
|
if (!cache)
|
||||||
|
@@ -404,6 +408,7 @@ FcDirCacheRescan (const FcChar8 *dir, FcConfig *config)
|
||||||
|
if (!dirs)
|
||||||
|
goto bail;
|
||||||
|
|
||||||
|
+ fd = FcDirCacheLock (dir, config);
|
||||||
|
/*
|
||||||
|
* Scan the dir
|
||||||
|
*/
|
||||||
|
@@ -422,6 +427,7 @@ FcDirCacheRescan (const FcChar8 *dir, FcConfig *config)
|
||||||
|
FcDirCacheWrite (new, config);
|
||||||
|
|
||||||
|
bail1:
|
||||||
|
+ FcDirCacheUnlock (fd);
|
||||||
|
FcStrSetDestroy (dirs);
|
||||||
|
bail:
|
||||||
|
if (d)
|
||||||
|
diff --git a/src/fcint.h b/src/fcint.h
|
||||||
|
index 15e22fd..76becec 100644
|
||||||
|
--- a/src/fcint.h
|
||||||
|
+++ b/src/fcint.h
|
||||||
|
@@ -590,6 +590,13 @@ FcCacheFini (void);
|
||||||
|
FcPrivate void
|
||||||
|
FcDirCacheReference (FcCache *cache, int nref);
|
||||||
|
|
||||||
|
+FcPrivate int
|
||||||
|
+FcDirCacheLock (const FcChar8 *dir,
|
||||||
|
+ FcConfig *config);
|
||||||
|
+
|
||||||
|
+FcPrivate void
|
||||||
|
+FcDirCacheUnlock (int fd);
|
||||||
|
+
|
||||||
|
/* fccfg.c */
|
||||||
|
|
||||||
|
FcPrivate FcBool
|
@ -3,7 +3,7 @@
|
|||||||
Summary: Font configuration and customization library
|
Summary: Font configuration and customization library
|
||||||
Name: fontconfig
|
Name: fontconfig
|
||||||
Version: 2.11.94
|
Version: 2.11.94
|
||||||
Release: 2%{?dist}
|
Release: 3%{?dist}
|
||||||
# src/ftglue.[ch] is in Public Domain
|
# src/ftglue.[ch] is in Public Domain
|
||||||
# src/fccache.c contains Public Domain code
|
# src/fccache.c contains Public Domain code
|
||||||
# fc-case/CaseFolding.txt is in the UCD
|
# fc-case/CaseFolding.txt is in the UCD
|
||||||
@ -16,6 +16,8 @@ Source1: 25-no-bitmap-fedora.conf
|
|||||||
|
|
||||||
# https://bugzilla.redhat.com/show_bug.cgi?id=140335
|
# https://bugzilla.redhat.com/show_bug.cgi?id=140335
|
||||||
Patch0: %{name}-sleep-less.patch
|
Patch0: %{name}-sleep-less.patch
|
||||||
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1236034
|
||||||
|
Patch1: %{name}-lock-cache.patch
|
||||||
|
|
||||||
BuildRequires: expat-devel
|
BuildRequires: expat-devel
|
||||||
BuildRequires: freetype-devel >= %{freetype_version}
|
BuildRequires: freetype-devel >= %{freetype_version}
|
||||||
@ -58,6 +60,7 @@ which is useful for developing applications that uses fontconfig.
|
|||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
%patch0 -p1 -b .sleep-less
|
%patch0 -p1 -b .sleep-less
|
||||||
|
%patch1 -p1 -b .lock-cache
|
||||||
|
|
||||||
%build
|
%build
|
||||||
# We don't want to rebuild the docs, but we want to install the included ones.
|
# We don't want to rebuild the docs, but we want to install the included ones.
|
||||||
@ -134,6 +137,9 @@ fi
|
|||||||
%doc fontconfig-devel.txt fontconfig-devel
|
%doc fontconfig-devel.txt fontconfig-devel
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Aug 12 2015 Akira TAGOH <tagoh@redhat.com> - 2.11.94-3
|
||||||
|
- Lock the cache file until scanning and writing finished. (#1236034)
|
||||||
|
|
||||||
* Wed Jun 17 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2.11.94-2
|
* Wed Jun 17 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2.11.94-2
|
||||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user