Index: configure.ac ================================================================== --- configure.ac +++ configure.ac @@ -274,12 +274,15 @@ [Whether gcc atomic operations are available]) ], [AC_MSG_RESULT(no)]) AC_CHECK_HEADER(libkern/OSAtomic.h, [ test x"$atomic_ops" = x"none" && atomic_ops="libkern/OSAtomic.h" - AC_DEFINE(OF_HAVE_LIBKERN_OSATOMIC_H, 1, - [Whether we have libkern/OSAtomic.h])]) + AC_DEFINE(OF_HAVE_OSATOMIC, 1, + [Whether we have libkern/OSAtomic.h]) + AC_CHECK_FUNC(OSAtomicAdd64Barrier, [ + AC_DEFINE(OF_HAVE_OSATOMIC_64, 1, + [Whether we have OSAtomic*64])])]) else dnl We can only have one thread - therefore everything is atomic atomic_ops="not needed" fi Index: src/OFBlock.m ================================================================== --- src/OFBlock.m +++ src/OFBlock.m @@ -15,10 +15,11 @@ #include #include #include #import "OFBlock.h" +#import "atomic.h" /// \cond internal @protocol RetainRelease - retain; - (void)release; Index: src/atomic.h ================================================================== --- src/atomic.h +++ src/atomic.h @@ -7,18 +7,20 @@ * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE included in * the packaging of this file. */ +#include + #import "macros.h" #if defined(OF_THREADS) && !defined(OF_X86_ASM) && !defined(OF_AMD64_ASM) && \ - !defined(OF_HAVE_GCC_ATOMIC_OPS) && !defined(OF_HAVE_LIBKERN_OSATOMIC_H) + !defined(OF_HAVE_GCC_ATOMIC_OPS) && !defined(OF_HAVE_OSATOMIC) # error No atomic operations available! #endif -#ifdef OF_HAVE_LIBKERN_OSATOMIC_H +#ifdef OF_HAVE_OSATOMIC # include #endif static OF_INLINE int of_atomic_add_int(volatile int *p, int i) @@ -35,15 +37,17 @@ ); return i; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_add_and_fetch(p, i); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) if (sizeof(int) == 4) return OSAtomicAdd32Barrier(i, p); +# ifdef OF_HAVE_OSATOMIC_64 else if (sizeof(int) == 8) return OSAtomicAdd64Barrier(i, p); +# endif else abort(); #endif } @@ -62,11 +66,11 @@ ); return i; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_add_and_fetch(p, i); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) return OSAtomicAdd32Barrier(i, p); #endif } static OF_INLINE void* @@ -84,15 +88,17 @@ ); return (void*)i; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_add_and_fetch(p, i); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) if (sizeof(void*) == 4) - return OSAtomicAdd32Barrier(i, p); + return (void*)OSAtomicAdd32Barrier(i, (int32_t*)p); +# ifdef OF_HAVE_OSATOMIC_64 else if (sizeof(void*) == 8) - return OSAtomicAdd64Barrier(i, p); + return (void*)OSAtomicAdd64Barrier(i, (int64_t*)p); +# endif else abort(); #endif } @@ -112,15 +118,17 @@ ); return i; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_sub_and_fetch(p, i); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) if (sizeof(int) == 4) return OSAtomicAdd32Barrier(-i, p); +# ifdef OF_HAVE_OSATOMIC_64 else if (sizeof(int) == 8) return OSAtomicAdd64Barrier(-i, p); +# endif else abort(); #endif } @@ -140,11 +148,11 @@ ); return i; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_sub_and_fetch(p, i); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) return OSAtomicAdd32Barrier(-i, p); #endif } static OF_INLINE void* @@ -163,15 +171,17 @@ ); return (void*)i; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_sub_and_fetch(p, i); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) if (sizeof(void*) == 4) - return OSAtomicAdd32Barrier(-i, p); + return (void*)OSAtomicAdd32Barrier(-i, (int32_t*)p); +# ifdef OF_HAVE_OSATOMIC_64 else if (sizeof(void*) == 8) - return OSAtomicAdd64Barrier(-i, p); + return (void*)OSAtomicAdd64Barrier(-i, (int64_t*)p); +# endif else abort(); #endif } @@ -194,15 +204,17 @@ ); return i; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_add_and_fetch(p, 1); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) if (sizeof(int) == 4) return OSAtomicIncrement32Barrier(p); +# ifdef OF_HAVE_OSATOMIC_64 else if (sizeof(int) == 8) return OSAtomicDecrement64Barrier(p); +# endif else abort(); #endif } static OF_INLINE int32_t @@ -224,11 +236,11 @@ ); return i; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_add_and_fetch(p, 1); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) return OSAtomicIncrement32Barrier(p); #endif } static OF_INLINE int @@ -250,15 +262,17 @@ ); return i; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_sub_and_fetch(p, 1); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) if (sizeof(int) == 4) return OSAtomicDecrement32Barrier(p); +# ifdef OF_HAVE_OSATOMIC_64 else if (sizeof(int) == 8) return OSAtomicDecrement64Barrier(p); +# endif else abort(); #endif } @@ -281,11 +295,11 @@ ); return i; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_sub_and_fetch(p, 1); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) return OSAtomicDecrement32Barrier(p); #endif } static OF_INLINE unsigned int @@ -308,15 +322,17 @@ ); return i; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_or_and_fetch(p, i); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) if (sizeof(int) == 4) return OSAtomicOr32Barrier(i, p); +# ifdef OF_HAVE_OSATOMIC_64 else if (sizeof(int) == 8) return OSAtomicOr64Barrier(i, p); +# endif else abort(); #endif } @@ -340,11 +356,11 @@ ); return i; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_or_and_fetch(p, i); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) return OSAtomicOr32Barrier(i, p); #endif } static OF_INLINE unsigned int @@ -367,15 +383,17 @@ ); return i; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_and_and_fetch(p, i); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) if (sizeof(int) == 4) return OSAtomicAnd32Barrier(i, p); +# ifdef OF_HAVE_OSATOMIC_64 else if (sizeof(int) == 8) return OSAtomicAnd64Barrier(i, p); +# endif else abort(); #endif } @@ -399,11 +417,11 @@ ); return i; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_and_and_fetch(p, i); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) return OSAtomicAnd32Barrier(i, p); #endif } static OF_INLINE unsigned int @@ -426,15 +444,17 @@ ); return i; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_xor_and_fetch(p, i); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) if (sizeof(int) == 4) return OSAtomicXor32Barrier(i, p); +# ifdef OF_HAVE_OSATOMIC_64 else (sizeof(int) == 8) return OSAtomicXor64Barrier(i, p); +# endif else abort(); #endif } @@ -458,11 +478,11 @@ ); return i; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_xor_and_fetch(p, i); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) return OSAtomicXor32Barrier(i, p); #endif } static OF_INLINE BOOL @@ -490,11 +510,11 @@ ); return r; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_bool_compare_and_swap(p, o, n); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) return OSAtomicCompareAndSwapIntBarrier(o, n, p); #endif } static OF_INLINE BOOL @@ -522,11 +542,11 @@ ); return r; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_bool_compare_and_swap(p, o, n); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) return OSAtomicCompareAndSwap32Barrier(o, n, p); #endif } static OF_INLINE BOOL @@ -554,9 +574,9 @@ ); return r; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_bool_compare_and_swap(p, o, n); -#elif defined(OF_HAVE_LIBKERN_OSATOMIC_H) +#elif defined(OF_HAVE_OSATOMIC) return OSAtomicCompareAndSwapPtrBarrier(o, n, p); #endif } Index: src/objfw-defs.h.in ================================================================== --- src/objfw-defs.h.in +++ src/objfw-defs.h.in @@ -5,11 +5,12 @@ #undef OF_GNU_RUNTIME #undef OF_HAVE_ASPRINTF #undef OF_HAVE_BLOCKS #undef OF_HAVE_FAST_ENUMERATION #undef OF_HAVE_GCC_ATOMIC_OPS -#undef OF_HAVE_LIBKERN_OSATOMIC_H +#undef OF_HAVE_OSATOMIC +#undef OF_HAVE_OSATOMIC_64 #undef OF_HAVE_POLL #undef OF_HAVE_PROPERTIES #undef OF_HAVE_PTHREADS #undef OF_HAVE_PTHREAD_SPINLOCKS #undef OF_HAVE_SCHED_YIELD