Index: third_party/harfbuzz-ng/src/hb-atomic-private.hh |
=================================================================== |
--- third_party/harfbuzz-ng/src/hb-atomic-private.hh (리비전 189447) |
+++ third_party/harfbuzz-ng/src/hb-atomic-private.hh (작업 사본) |
@@ -42,27 +42,15 @@ |
#if 0 |
-#elif !defined(HB_NO_MT) && defined(_MSC_VER) || defined(__MINGW32__) |
+#elif !defined(HB_NO_MT) && (defined(_WIN32) || defined(__CYGWIN__)) |
#define WIN32_LEAN_AND_MEAN |
#include <windows.h> |
-/* mingw32 does not have MemoryBarrier. |
- * MemoryBarrier may be defined as a macro or a function. |
- * Just make a failsafe version for ourselves. */ |
-#ifdef MemoryBarrier |
-#define HBMemoryBarrier MemoryBarrier |
-#else |
-static inline void HBMemoryBarrier (void) { |
- long dummy = 0; |
- InterlockedExchange (&dummy, 1); |
-} |
-#endif |
- |
typedef LONG hb_atomic_int_t; |
#define hb_atomic_int_add(AI, V) InterlockedExchangeAdd (&(AI), (V)) |
-#define hb_atomic_ptr_get(P) (HBMemoryBarrier (), (void *) *(P)) |
+#define hb_atomic_ptr_get(P) (MemoryBarrier (), (void *) *(P)) |
#define hb_atomic_ptr_cmpexch(P,O,N) (InterlockedCompareExchangePointer ((void **) (P), (void *) (N), (void *) (O)) == (void *) (O)) |
@@ -99,6 +87,18 @@ |
#define hb_atomic_ptr_cmpexch(P,O,N) __sync_bool_compare_and_swap ((P), (O), (N)) |
+#elif !defined(HB_NO_MT) && defined(HAVE_SOLARIS_ATOMIC_OPS) |
+ |
+#include <atomic.h> |
+#include <mbarrier.h> |
+ |
+typedef unsigned int hb_atomic_int_t; |
+#define hb_atomic_int_add(AI, V) ( ({__machine_rw_barrier ();}), atomic_add_int_nv (&(AI), (V)) - (V)) |
+ |
+#define hb_atomic_ptr_get(P) ( ({__machine_rw_barrier ();}), (void *) *(P)) |
+#define hb_atomic_ptr_cmpexch(P,O,N) ( ({__machine_rw_barrier ();}), atomic_cas_ptr ((void **) (P), (void *) (O), (void *) (N)) == (void *) (O) ? true : false) |
+ |
+ |
#elif !defined(HB_NO_MT) |
#define HB_ATOMIC_INT_NIL 1 /* Warn that fallback implementation is in use. */ |