/*
 * fontconfig/doc/fcatomic.fncs
 *
 * Copyright © 2003 Keith Packard
 *
 * Permission to use, copy, modify, distribute, and sell this software and its
 * documentation for any purpose is hereby granted without fee, provided that
 * the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation, and that the name of the author(s) not be used in
 * advertising or publicity pertaining to distribution of the software without
 * specific, written prior permission.  The authors make no
 * representations about the suitability of this software for any purpose.  It
 * is provided "as is" without express or implied warranty.
 *
 * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */

@RET@           FcAtomic *
@FUNC@          FcAtomicCreate
@TYPE1@         const FcChar8   *           	@ARG1@          file
@PURPOSE@	create an FcAtomic object
@DESC@
Creates a data structure containing data needed to control access to <parameter>file</parameter>.
Writing is done to a separate file.  Once that file is complete, the original
configuration file is atomically replaced so that reading process always see
a consistent and complete file without the need to lock for reading.
@@

@RET@           FcBool
@FUNC@          FcAtomicLock
@TYPE1@         FcAtomic *                      @ARG1@          atomic
@PURPOSE@	lock a file
@DESC@
Attempts to lock the file referenced by <parameter>atomic</parameter>.
Returns FcFalse if the file is already locked, else returns FcTrue and
leaves the file locked.
@@

@RET@           FcChar8 *
@FUNC@          FcAtomicNewFile
@TYPE1@         FcAtomic *                      @ARG1@          atomic
@PURPOSE@	return new temporary file name 
@DESC@
Returns the filename for writing a new version of the file referenced
by <parameter>atomic</parameter>.
@@

@RET@           FcChar8 *
@FUNC@          FcAtomicOrigFile
@TYPE1@         FcAtomic *                      @ARG1@          atomic
@PURPOSE@	return original file name
@DESC@
Returns the file referenced by <parameter>atomic</parameter>.
@@

@RET@           FcBool
@FUNC@          FcAtomicReplaceOrig
@TYPE1@         FcAtomic *                      @ARG1@          atomic
@PURPOSE@	replace original with new
@DESC@
Replaces the original file referenced by <parameter>atomic</parameter> with
the new file. Returns FcFalse if the file cannot be replaced due to
permission issues in the filesystem. Otherwise returns FcTrue.
@@

@RET@           void
@FUNC@          FcAtomicDeleteNew
@TYPE1@         FcAtomic *                      @ARG1@          atomic
@PURPOSE@	delete new file
@DESC@
Deletes the new file.  Used in error recovery to back out changes.
@@

@RET@           void
@FUNC@          FcAtomicUnlock
@TYPE1@         FcAtomic *                      @ARG1@          atomic
@PURPOSE@	unlock a file
@DESC@
Unlocks the file.
@@

@RET@           void
@FUNC@          FcAtomicDestroy
@TYPE1@         FcAtomic *                      @ARG1@          atomic
@PURPOSE@	destroy an FcAtomic object
@DESC@
Destroys <parameter>atomic</parameter>.
@@
