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.
Этот коммит содержится в:
родитель
e77f60abfe
Коммит
af39262a66
@ -86,6 +86,24 @@ static inline int opal_atomic_cmpset_32( volatile int32_t *addr,
|
|||||||
return (oldval == ret) ? 1: 0;
|
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,
|
static inline int opal_atomic_cmpset_acq_64( volatile int64_t *addr,
|
||||||
int64_t oldval, int64_t newval)
|
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
|
* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/interlockedcompareexchange64.asp
|
||||||
*/
|
*/
|
||||||
#endif /* OMPI_ENABLE_DEBUG */
|
#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 ret = InterlockedCompareExchangeAcquire64 ((int64_t volatile*) addr,
|
||||||
(int64_t) newval, (int64_t) oldval);
|
(int64_t) newval, (int64_t) oldval);
|
||||||
return (oldval == ret) ? 1: 0;
|
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,
|
static inline int opal_atomic_cmpset_rel_64( volatile int64_t *addr,
|
||||||
int64_t oldval, int64_t newval)
|
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 ret = InterlockedCompareExchangeRelease64 ((int64_t volatile*) addr,
|
||||||
(int64_t) newval, (int64_t) oldval);
|
(int64_t) newval, (int64_t) oldval);
|
||||||
return (oldval == ret) ? 1: 0;
|
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,
|
static inline int opal_atomic_cmpset_64( volatile int64_t *addr,
|
||||||
int64_t oldval, int64_t newval)
|
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 ret = InterlockedCompareExchange64 ((int64_t volatile*) addr,
|
||||||
(int64_t) newval, (int64_t) oldval);
|
(int64_t) newval, (int64_t) oldval);
|
||||||
return (oldval == ret) ? 1: 0;
|
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_MATH_64 1
|
||||||
#define OPAL_HAVE_ATOMIC_ADD_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,
|
return InterlockedExchangeAdd64 ((int64_t volatile *) addr,
|
||||||
(int64_t) delta);
|
(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)
|
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,
|
return InterlockedExchangeAdd64 ((int64_t volatile *) addr,
|
||||||
(int64_t) (-delta));
|
(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 */
|
#endif /* ! OMPI_SYS_ARCH_ATOMIC_H */
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user