--- atomic/win32/apr_atomic.c (revision 591628) +++ atomic/win32/apr_atomic.c (working copy) @@ -18,6 +18,16 @@ #include "apr_atomic.h" #include "apr_thread_mutex.h" +#if _MSC_VER >= 1310 +#define USE_ATOMICS_BUILTINS +#include +#pragma intrinsic( _InterlockedIncrement ) +#pragma intrinsic( _InterlockedDecrement ) +#pragma intrinsic( _InterlockedCompareExchange ) +#pragma intrinsic( _InterlockedExchange ) +#pragma intrinsic( _InterlockedExchangeAdd ) +#endif + APR_DECLARE(apr_status_t) apr_atomic_init(apr_pool_t *p) { return APR_SUCCESS; @@ -44,7 +54,9 @@ APR_DECLARE(apr_uint32_t) apr_atomic_add32(volatile apr_uint32_t *mem, apr_uint32_t val) { -#if (defined(_M_IA64) || defined(_M_AMD64)) +#if defined(USE_ATOMICS_BUILTINS) + return _InterlockedExchangeAdd(mem, val); +#elif (defined(_M_IA64) || defined(_M_AMD64)) return InterlockedExchangeAdd(mem, val); #elif defined(__MINGW32__) return InterlockedExchangeAdd((long *)mem, val); @@ -58,7 +70,9 @@ APR_DECLARE(void) apr_atomic_sub32(volatile apr_uint32_t *mem, apr_uint32_t val) { -#if (defined(_M_IA64) || defined(_M_AMD64)) +#if defined(USE_ATOMICS_BUILTINS) + _InterlockedExchangeAdd(mem, -val); +#elif (defined(_M_IA64) || defined(_M_AMD64)) InterlockedExchangeAdd(mem, -val); #elif defined(__MINGW32__) InterlockedExchangeAdd((long *)mem, -val); @@ -70,7 +84,9 @@ APR_DECLARE(apr_uint32_t) apr_atomic_inc32(volatile apr_uint32_t *mem) { /* we return old value, win32 returns new value :( */ -#if (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) +#if defined(USE_ATOMICS_BUILTINS) + return _InterlockedIncrement(mem) - 1; +#elif (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) return InterlockedIncrement(mem) - 1; #elif defined(__MINGW32__) return InterlockedIncrement((long *)mem) - 1; @@ -81,7 +97,9 @@ APR_DECLARE(int) apr_atomic_dec32(volatile apr_uint32_t *mem) { -#if (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) +#if defined(USE_ATOMICS_BUILTINS) + return _InterlockedDecrement(mem); +#elif (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) return InterlockedDecrement(mem); #elif defined(__MINGW32__) return InterlockedDecrement((long *)mem); @@ -92,7 +110,9 @@ APR_DECLARE(void) apr_atomic_set32(volatile apr_uint32_t *mem, apr_uint32_t val) { -#if (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) +#if defined(USE_ATOMICS_BUILTINS) + _InterlockedExchange(mem, val); +#elif (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) InterlockedExchange(mem, val); #elif defined(__MINGW32__) InterlockedExchange((long*)mem, val); @@ -109,7 +129,9 @@ APR_DECLARE(apr_uint32_t) apr_atomic_cas32(volatile apr_uint32_t *mem, apr_uint32_t with, apr_uint32_t cmp) { -#if (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) +#if defined(USE_ATOMICS_BUILTINS) + return _InterlockedCompareExchange(mem, with, cmp); +#elif (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) return InterlockedCompareExchange(mem, with, cmp); #elif defined(__MINGW32__) return InterlockedCompareExchange((long*)mem, with, cmp); @@ -125,14 +147,20 @@ #elif defined(__MINGW32__) return InterlockedCompareExchangePointer((void**)mem, with, (void*)cmp); #else +#ifdef USE_ATOMICS_BUILTINS + return (void*)_InterlockedCompareExchange((long*)mem, (long)with, (long)cmp); +#else /* Too many VC6 users have stale win32 API files, stub this */ return ((apr_atomic_win32_ptr_ptr_ptr_fn)InterlockedCompareExchange)(mem, with, cmp); #endif +#endif } APR_DECLARE(apr_uint32_t) apr_atomic_xchg32(volatile apr_uint32_t *mem, apr_uint32_t val) { -#if (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) +#if defined(USE_ATOMICS_BUILTINS) + return _InterlockedExchange(mem, val); +#elif (defined(_M_IA64) || defined(_M_AMD64)) && !defined(RC_INVOKED) return InterlockedExchange(mem, val); #elif defined(__MINGW32__) return InterlockedExchange((long *)mem, val); @@ -146,7 +174,11 @@ #if (defined(_M_IA64) || defined(_M_AMD64) || defined(__MINGW32__)) && !defined(RC_INVOKED) return InterlockedExchangePointer((void**)mem, with); #else +#ifdef USE_ATOMICS_BUILTINS + return (void*)_InterlockedExchange((long*)mem, (long)with); +#else /* Too many VC6 users have stale win32 API files, stub this */ return ((apr_atomic_win32_ptr_ptr_fn)InterlockedExchange)(mem, with); #endif +#endif }