Add new FcAtomic datatype for config file locking

This commit is contained in:
Keith Packard 2002-03-01 22:06:30 +00:00
parent d23a2a6dfa
commit 134f6011f3
4 changed files with 57 additions and 28 deletions

View File

@ -1,5 +1,5 @@
/*
* $XFree86: xc/lib/fontconfig/fontconfig/fontconfig.h,v 1.4 2002/02/28 16:51:48 keithp Exp $
* $XFree86: xc/lib/fontconfig/fontconfig/fontconfig.h,v 1.5 2002/03/01 01:00:54 keithp Exp $
*
* Copyright © 2001 Keith Packard, member of The XFree86 Project, Inc.
*
@ -212,6 +212,8 @@ typedef enum _FcSetName {
FcSetApplication = 1
} FcSetName;
typedef struct _FcAtomic FcAtomic;
#if defined(__cplusplus) || defined(c_plusplus) /* for C++ V2.0 */
#define _FCFUNCPROTOBEGIN extern "C" { /* do not leave open across includes */
#define _FCFUNCPROTOEND }
@ -417,6 +419,32 @@ FcFontList (FcConfig *config,
FcPattern *p,
FcObjectSet *os);
/* fcatomic.c */
FcAtomic *
FcAtomicCreate (const FcChar8 *file);
FcBool
FcAtomicLock (FcAtomic *atomic);
FcChar8 *
FcAtomicNewFile (FcAtomic *atomic);
FcChar8 *
FcAtomicOrigFile (FcAtomic *atomic);
FcBool
FcAtomicReplaceOrig (FcAtomic *atomic);
void
FcAtomicDeleteNew (FcAtomic *atomic);
void
FcAtomicUnlock (FcAtomic *atomic);
void
FcAtomicDestroy (FcAtomic *atomic);
/* fcmatch.c */
FcPattern *
FcFontSetMatch (FcConfig *config,

View File

@ -28,13 +28,13 @@ DEFINES=-DFC_FALLBACK_FONTS='"$(FALLBACK_FONTS)"'
EXPATLIB=-lexpat
REQUIREDLIBS=$(LDPRELIBS) $(FREETYPE2LIB) $(EXPATLIB)
SRCS=fcblanks.c fccache.c fccfg.c fccharset.c fcdbg.c fcdefault.c fcdir.c \
fcfreetype.c fcfs.c fcinit.c fclist.c fcmatch.c fcmatrix.c fcname.c \
fcpat.c fcstr.c fcxml.c
SRCS=fcatomic.c fcblanks.c fccache.c fccfg.c fccharset.c fcdbg.c \
fcdefault.c fcdir.c fcfreetype.c fcfs.c fcinit.c fclist.c fcmatch.c \
fcmatrix.c fcname.c fcpat.c fcstr.c fcxml.c
OBJS=fcblanks.o fccache.o fccfg.o fccharset.o fcdbg.o fcdefault.o fcdir.o \
fcfreetype.o fcfs.o fcinit.o fclist.o fcmatch.o fcmatrix.o fcname.o \
fcpat.o fcstr.o fcxml.o
OBJS=fcatomic.o fcblanks.o fccache.o fccfg.o fccharset.o fcdbg.o \
fcdefault.o fcdir.o fcfreetype.o fcfs.o fcinit.o fclist.o fcmatch.o \
fcmatrix.o fcname.o fcpat.o fcstr.o fcxml.o
#include <Library.tmpl>

View File

@ -1,5 +1,5 @@
/*
* $XFree86: xc/lib/fontconfig/src/fccache.c,v 1.3 2002/02/19 07:50:43 keithp Exp $
* $XFree86: xc/lib/fontconfig/src/fccache.c,v 1.4 2002/03/01 01:00:54 keithp Exp $
*
* Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
*
@ -416,28 +416,20 @@ FcBool
FcFileCacheSave (FcFileCache *cache,
const FcChar8 *cache_file)
{
FcChar8 *lck;
FcChar8 *tmp;
FILE *f;
int h;
FcFileCacheEnt *c;
FcFileCacheEnt *c;
FcAtomic *atomic;
if (!cache->updated && cache->referenced == cache->entries)
return FcTrue;
lck = malloc (strlen ((char *) cache_file)*2 + 4);
if (!lck)
atomic = FcAtomicCreate (cache_file);
if (!atomic)
goto bail0;
tmp = lck + strlen ((char *) cache_file) + 2;
strcpy ((char *) lck, (char *) cache_file);
strcat ((char *) lck, "L");
strcpy ((char *) tmp, (char *) cache_file);
strcat ((char *) tmp, "T");
if (link ((char *) lck, (char *) cache_file) < 0 && errno != ENOENT)
if (!FcAtomicLock (atomic))
goto bail1;
if (access ((char *) tmp, F_OK) == 0)
goto bail2;
f = fopen ((char *) tmp, "w");
f = fopen ((char *) FcAtomicNewFile(atomic), "w");
if (!f)
goto bail2;
@ -469,21 +461,23 @@ FcFileCacheSave (FcFileCache *cache,
if (fclose (f) == EOF)
goto bail3;
if (rename ((char *) tmp, (char *) cache_file) < 0)
if (!FcAtomicReplaceOrig (atomic))
goto bail3;
unlink ((char *) lck);
FcAtomicUnlock (atomic);
FcAtomicDestroy (atomic);
cache->updated = FcFalse;
return FcTrue;
bail4:
fclose (f);
bail3:
unlink ((char *) tmp);
FcAtomicDeleteNew (atomic);
bail2:
unlink ((char *) lck);
FcAtomicUnlock (atomic);
bail1:
free (lck);
FcAtomicDestroy (atomic);
bail0:
return FcFalse;
}

View File

@ -1,5 +1,5 @@
/*
* $XFree86: xc/lib/fontconfig/src/fcint.h,v 1.3 2002/02/18 22:29:28 keithp Exp $
* $XFree86: xc/lib/fontconfig/src/fcint.h,v 1.4 2002/02/19 08:33:23 keithp Exp $
*
* Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
*
@ -200,6 +200,13 @@ struct _FcFileCache {
int referenced;
};
struct _FcAtomic {
FcChar8 *file; /* original file name */
FcChar8 *new; /* temp file name -- write data here */
FcChar8 *lck; /* lockfile name (used for locking) */
FcChar8 *tmp; /* tmpfile name (used for locking) */
};
struct _FcBlanks {
int nblank;
int sblank;