OLD | NEW |
(Empty) | |
| 1 diff --git a/source/common/putilimp.h b/source/common/putilimp.h |
| 2 index e3da340..90bae92 100644 |
| 3 --- a/source/common/putilimp.h |
| 4 +++ b/source/common/putilimp.h |
| 5 @@ -1,7 +1,7 @@ |
| 6 /* |
| 7 ****************************************************************************** |
| 8 * |
| 9 -* Copyright (C) 1997-2014, International Business Machines |
| 10 +* Copyright (C) 1997-2015, International Business Machines |
| 11 * Corporation and others. All Rights Reserved. |
| 12 * |
| 13 ****************************************************************************** |
| 14 @@ -229,6 +229,26 @@ typedef size_t uintptr_t; |
| 15 #endif |
| 16 |
| 17 |
| 18 +/** |
| 19 + * \def U_HAVE_CLANG_ATOMICS |
| 20 + * Defines whether Clang c11 style built-in atomics are avaialable. |
| 21 + * These are used in preference to gcc atomics when both are available. |
| 22 + */ |
| 23 +#ifdef U_HAVE_CLANG_ATOMICS |
| 24 + /* Use the predefined value. */ |
| 25 +#elif !defined(__clang__) |
| 26 +# define U_HAVE_CLANG_ATOMICS 0 |
| 27 +#else |
| 28 +#if __has_builtin(__c11_atomic_load) && \ |
| 29 + __has_builtin(__c11_atomic_store) && \ |
| 30 + __has_builtin(__c11_atomic_fetch_add) && \ |
| 31 + __has_builtin(__c11_atomic_fetch_sub) |
| 32 +# define U_HAVE_CLANG_ATOMICS 1 |
| 33 +#else |
| 34 +# define U_HAVE_CLANG_ATOMICS 0 |
| 35 +#endif |
| 36 +#endif |
| 37 + |
| 38 /*===========================================================================*/ |
| 39 /** @{ Code alignment */ |
| 40 /*===========================================================================*/ |
| 41 diff --git a/source/common/umutex.cpp b/source/common/umutex.cpp |
| 42 index 0c1fdc8..581f2b9 100644 |
| 43 --- a/source/common/umutex.cpp |
| 44 +++ b/source/common/umutex.cpp |
| 45 @@ -349,8 +349,8 @@ umtx_atomic_dec(u_atomic_int32_t *p) { |
| 46 |
| 47 U_COMMON_API int32_t U_EXPORT2 |
| 48 umtx_loadAcquire(u_atomic_int32_t &var) { |
| 49 - int32_t val = var; |
| 50 umtx_lock(&gIncDecMutex); |
| 51 + int32_t val = var; |
| 52 umtx_unlock(&gIncDecMutex); |
| 53 return val; |
| 54 } |
| 55 @@ -358,8 +358,8 @@ umtx_loadAcquire(u_atomic_int32_t &var) { |
| 56 U_COMMON_API void U_EXPORT2 |
| 57 umtx_storeRelease(u_atomic_int32_t &var, int32_t val) { |
| 58 umtx_lock(&gIncDecMutex); |
| 59 - umtx_unlock(&gIncDecMutex); |
| 60 var = val; |
| 61 + umtx_unlock(&gIncDecMutex); |
| 62 } |
| 63 |
| 64 U_NAMESPACE_END |
| 65 diff --git a/source/common/umutex.h b/source/common/umutex.h |
| 66 index e0ad0d3..0e4d118 100644 |
| 67 --- a/source/common/umutex.h |
| 68 +++ b/source/common/umutex.h |
| 69 @@ -1,6 +1,6 @@ |
| 70 /* |
| 71 ********************************************************************** |
| 72 -* Copyright (C) 1997-2014, International Business Machines |
| 73 +* Copyright (C) 1997-2015, International Business Machines |
| 74 * Corporation and others. All Rights Reserved. |
| 75 ********************************************************************** |
| 76 * |
| 77 @@ -118,6 +118,33 @@ inline int32_t umtx_atomic_dec(u_atomic_int32_t *var) { |
| 78 U_NAMESPACE_END |
| 79 |
| 80 |
| 81 +#elif U_HAVE_CLANG_ATOMICS |
| 82 +/* |
| 83 + * Clang __c11 atomic built-ins |
| 84 + */ |
| 85 + |
| 86 +U_NAMESPACE_BEGIN |
| 87 +typedef _Atomic(int32_t) u_atomic_int32_t; |
| 88 +#define ATOMIC_INT32_T_INITIALIZER(val) val |
| 89 + |
| 90 +inline int32_t umtx_loadAcquire(u_atomic_int32_t &var) { |
| 91 + return __c11_atomic_load(&var, __ATOMIC_ACQUIRE); |
| 92 +} |
| 93 + |
| 94 +inline void umtx_storeRelease(u_atomic_int32_t &var, int32_t val) { |
| 95 + return __c11_atomic_store(&var, val, __ATOMIC_RELEASE); |
| 96 +} |
| 97 + |
| 98 +inline int32_t umtx_atomic_inc(u_atomic_int32_t *var) { |
| 99 + return __c11_atomic_fetch_add(var, 1, __ATOMIC_SEQ_CST) + 1; |
| 100 +} |
| 101 + |
| 102 +inline int32_t umtx_atomic_dec(u_atomic_int32_t *var) { |
| 103 + return __c11_atomic_fetch_sub(var, 1, __ATOMIC_SEQ_CST) - 1; |
| 104 +} |
| 105 +U_NAMESPACE_END |
| 106 + |
| 107 + |
| 108 #elif U_HAVE_GCC_ATOMICS |
| 109 /* |
| 110 * gcc atomic ops. These are available on several other compilers as well. |
OLD | NEW |