diff --git a/src/hb-atomic-private.hh b/src/hb-atomic-private.hh index 0f70641f490e626086dcdc15738389c7503149c2..4ae5b866a5fdc2472b81ec19c8f01d94426370f2 100644 --- a/src/hb-atomic-private.hh +++ b/src/hb-atomic-private.hh @@ -42,17 +42,28 @@ #if 0 -#elif !defined(HB_NO_MT) && defined(_MSC_VER) && _MSC_VER >= 1600 +#elif !defined(HB_NO_MT) && defined(_MSC_VER) || defined(__MINGW32__) -#include -/* On x86, _InterlockedCompareExchangePointer is a macro defined in concrt.h */ -#include +#define WIN32_LEAN_AND_MEAN +#include + +/* 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_int_add(AI, V) InterlockedExchangeAdd (&(AI), (V)) -#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)) +#define hb_atomic_ptr_get(P) (HBMemoryBarrier (), (void *) *(P)) +#define hb_atomic_ptr_cmpexch(P,O,N) (InterlockedCompareExchangePointer ((void **) (P), (void *) (N), (void *) (O)) == (void *) (O)) #elif !defined(HB_NO_MT) && defined(__APPLE__)