[Fontconfig] [PATCH] Fix compilation on Mac OS X 10.4

Misty De Meo misty at brew.sh
Sat May 4 22:11:31 PDT 2013

fontconfig fails to compile on Mac OS X 10.4 because it uses the
OSAtomicCompareAndSwapPtrBarrier() function in a macro definition in
fcatomic.h; this function was first introduced in 10.5.

This is the only function that fontconfig uses which isn't in Tiger,
and otherwise it compiles and functions perfectly. Tiger does have
32-bit and 64-bit specific equivalents to that function.

The patch below defines the macro to use those specific functions on
Tiger based on the CPU arch for which fontconfig is being used, and
otherwise uses OSAtomicCompareAndSwapPtrBarrier() on 10.5 and newer.
I've tested on both 10.4 and 10.7 to ensure that it works.

Misty De Meo

>From 7657bd4d690f218ed9f3a43045fc474a935cbe27 Mon Sep 17 00:00:00 2001
From: Misty De Meo <mistydemeo at gmail.com>
Date: Sun, 14 Apr 2013 22:10:21 -0500
Subject: [PATCH] Fix fc_atomic_ptr_cmpexch on Mac OS X 10.4

The OSAtomicCompareAndSwapPtrBarrier() function was introduced in Mac
OS X 10.5, but size-specific versions are available in 10.4.

This commit defines the fc_atomic_ptr_cmpexch macro using
OSAtomicCompareAndSwapPtrBarrier() on 10.5 or newer, and otherwise
defines it as the 32-bit or 64-bit equivalent based on the CPU
architecture for which fontconfig is being built.
 src/fcatomic.h | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/fcatomic.h b/src/fcatomic.h
index a764311..7d2fc7d 100644
--- a/src/fcatomic.h
+++ b/src/fcatomic.h
@@ -69,13 +69,23 @@ typedef LONG fc_atomic_int_t;

 #elif !defined(FC_NO_MT) && defined(__APPLE__)

+#include <AvailabilityMacros.h>
 #include <libkern/OSAtomic.h>

 typedef int fc_atomic_int_t;
 #define fc_atomic_int_add(AI, V)    (OSAtomicAdd32Barrier ((V), &(AI)) - (V))

 #define fc_atomic_ptr_get(P)        (OSMemoryBarrier (), (void *) *(P))
+/* OSAtomicCompareAndSwapPtrBarrier() was introduced in 10.5, but 32-bit
+ * and 64-bit specific functions are available in 10.4. */
+#ifdef MAC_OS_X_VERSION_10_5
 #define fc_atomic_ptr_cmpexch(P,O,N)
OSAtomicCompareAndSwapPtrBarrier ((void *) (O), (void *) (N), (void
**) (P))
+#elif defined(__LP64__)
+#define fc_atomic_ptr_cmpexch(P,O,N)  OSAtomicCompareAndSwap64Barrier
((void *) (O), (void *) (N), (void **) (P))
+#define fc_atomic_ptr_cmpexch(P,O,N)  OSAtomicCompareAndSwap32Barrier
((void *) (O), (void *) (N), (void **) (P))

 #elif !defined(FC_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES)

More information about the Fontconfig mailing list