From af39262a66ccef32d2576e4dc29f07acb565eff8 Mon Sep 17 00:00:00 2001 From: George Bosilca Date: Tue, 13 Dec 2005 06:08:45 +0000 Subject: [PATCH] I hope I get it right this time. We detect at configure time if the current Windows installation provide the 32 and 64 bits atomic operations and compile only the relevant part. For 64 bits there is a problem, but I already put a big comment about it in the configure file ... This commit was SVN r8480. --- opal/include/sys/win32/atomic.h | 77 +++++++++++++-------------------- 1 file changed, 31 insertions(+), 46 deletions(-) diff --git a/opal/include/sys/win32/atomic.h b/opal/include/sys/win32/atomic.h index 78dda12d94..2bcc3d51c2 100644 --- a/opal/include/sys/win32/atomic.h +++ b/opal/include/sys/win32/atomic.h @@ -86,6 +86,24 @@ static inline int opal_atomic_cmpset_32( volatile int32_t *addr, return (oldval == ret) ? 1: 0; } +#define OPAL_HAVE_ATOMIC_MATH_32 1 + +#define OPAL_HAVE_ATOMIC_ADD_32 1 +static inline int32_t opal_atomic_add_32(volatile int32_t *addr, int32_t delta) +{ + return InterlockedExchangeAdd ((LONG volatile *) addr, + (LONG) delta); +} + +#define OPAL_HAVE_ATOMIC_SUB_32 1 +static inline int32_t opal_atomic_sub_32(volatile int32_t *addr, int32_t delta) +{ + return InterlockedExchangeAdd( (LONG volatile *) addr, + (LONG) (-delta)); +} + +#if HAVE_INTERLOCKEDCOMPAREEXCHANGE64 +#define OPAL_HAVE_ATOMIC_CMPSET_64 1 static inline int opal_atomic_cmpset_acq_64( volatile int64_t *addr, int64_t oldval, int64_t newval) { @@ -94,83 +112,50 @@ static inline int opal_atomic_cmpset_acq_64( volatile int64_t *addr, * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/interlockedcompareexchange64.asp */ #endif /* OMPI_ENABLE_DEBUG */ -#if defined(OMPI_WINDOWS_HAVE_SUPPORT_FOR_64_BITS_ATOMIC) -#define OPAL_HAVE_ATOMIC_CMPSET_64 1 int64_t ret = InterlockedCompareExchangeAcquire64 ((int64_t volatile*) addr, (int64_t) newval, (int64_t) oldval); return (oldval == ret) ? 1: 0; -#else -#define OPAL_HAVE_ATOMIC_CMPSET_64 0 - return 0; -#endif /* OMPI_WINDOWS_HAVE_SUPPORT_FOR_64_BITS_ATOMIC */ } static inline int opal_atomic_cmpset_rel_64( volatile int64_t *addr, int64_t oldval, int64_t newval) { -#if defined(OMPI_WINDOWS_HAVE_SUPPORT_FOR_64_BITS_ATOMIC) int64_t ret = InterlockedCompareExchangeRelease64 ((int64_t volatile*) addr, (int64_t) newval, (int64_t) oldval); return (oldval == ret) ? 1: 0; -#else - return 0; -#endif /* OMPI_WINDOWS_HAVE_SUPPORT_FOR_64_BITS_ATOMIC */ } static inline int opal_atomic_cmpset_64( volatile int64_t *addr, int64_t oldval, int64_t newval) { -#if defined(OMPI_WINDOWS_HAVE_SUPPORT_FOR_64_BITS_ATOMIC) int64_t ret = InterlockedCompareExchange64 ((int64_t volatile*) addr, (int64_t) newval, (int64_t) oldval); return (oldval == ret) ? 1: 0; -#else - return 0; -#endif /* OMPI_WINDOWS_HAVE_SUPPORT_FOR_64_BITS_ATOMIC */ } -#define OPAL_HAVE_ATOMIC_MATH_32 1 - -#define OPAL_HAVE_ATOMIC_ADD_32 1 -static inline int32_t opal_atomic_add_32(volatile int32_t *addr, int32_t delta) -{ - return InterlockedExchangeAdd ((LONG volatile *) addr, - (LONG) delta); - -} - -static inline int64_t opal_atomic_add_64(volatile int64_t *addr, int64_t delta) -{ -#if defined(OMPI_WINDOWS_HAVE_SUPPORT_FOR_64_BITS_ATOMIC) #define OPAL_HAVE_ATOMIC_MATH_64 1 #define OPAL_HAVE_ATOMIC_ADD_64 1 +static inline int64_t opal_atomic_add_64(volatile int64_t *addr, int64_t delta) +{ return InterlockedExchangeAdd64 ((int64_t volatile *) addr, (int64_t) delta); -#else -#define OPAL_HAVE_ATOMIC_MATH_64 0 -#define OPAL_HAVE_ATOMIC_ADD_64 0 - return 0; -#endif /* OMPI_WINDOWS_HAVE_SUPPORT_FOR_64_BITS_ATOMIC */ -} - -#define OPAL_HAVE_ATOMIC_SUB_32 1 -static inline int32_t opal_atomic_sub_32(volatile int32_t *addr, int32_t delta) -{ - return InterlockedExchangeAdd( (LONG volatile *) addr, - (LONG) (-delta)); - } +#define OPAL_HAVE_ATOMIC_SUB_64 1 static inline int64_t opal_atomic_sub_64(volatile int64_t *addr, int64_t delta) { -#if defined(OMPI_WINDOWS_HAVE_SUPPORT_FOR_64_BITS_ATOMIC) -#define OPAL_HAVE_ATOMIC_SUB_64 1 return InterlockedExchangeAdd64 ((int64_t volatile *) addr, (int64_t) (-delta)); -#else -#define OPAL_HAVE_ATOMIC_SUB_64 0 - return 0; -#endif /* OMPI_WINDOWS_HAVE_SUPPORT_FOR_64_BITS_ATOMIC */ } + +#else + +#define OPAL_HAVE_ATOMIC_CMPSET_64 0 +#define OPAL_HAVE_ATOMIC_MATH_64 0 +#define OPAL_HAVE_ATOMIC_ADD_64 0 +#define OPAL_HAVE_ATOMIC_SUB_64 0 + +#endif /* HAVE_INTERLOCKEDCOMPAREEXCHANGE64 */ + #endif /* ! OMPI_SYS_ARCH_ATOMIC_H */