[win32] Add fallback implementations for gatomic.c on mingw32

Bug 682896 - glib doesn't build on mingw32
This commit is contained in:
Behdad Esfahbod 2013-02-25 22:01:11 -05:00
parent 8efe198d2e
commit e1ccae8416

View File

@ -467,19 +467,81 @@ gsize
#elif defined (G_PLATFORM_WIN32) #elif defined (G_PLATFORM_WIN32)
#include <windows.h> #include <windows.h>
#if !defined(_M_AMD64) && !defined (_M_IA64) && !defined(_M_X64) #if !defined(_M_AMD64) && !defined (_M_IA64) && !defined(_M_X64) && !(defined _MSC_VER && _MSC_VER <= 1200)
#define InterlockedAnd _InterlockedAnd #define InterlockedAnd _InterlockedAnd
#define InterlockedOr _InterlockedOr #define InterlockedOr _InterlockedOr
#define InterlockedXor _InterlockedXor #define InterlockedXor _InterlockedXor
#endif #endif
#if !defined (_MSC_VER) || _MSC_VER <= 1200
#include "gmessages.h"
/* Inlined versions for older compiler */
static LONG
_gInterlockedAnd (volatile guint *atomic,
guint val)
{
LONG i, j;
j = *atomic;
do {
i = j;
j = InterlockedCompareExchange(atomic, i & val, i);
} while (i != j);
return j;
}
#define InterlockedAnd(a,b) _gInterlockedAnd(a,b)
static LONG
_gInterlockedOr (volatile guint *atomic,
guint val)
{
LONG i, j;
j = *atomic;
do {
i = j;
j = InterlockedCompareExchange(atomic, i | val, i);
} while (i != j);
return j;
}
#define InterlockedOr(a,b) _gInterlockedOr(a,b)
static LONG
_gInterlockedXor (volatile guint *atomic,
guint val)
{
LONG i, j;
j = *atomic;
do {
i = j;
j = InterlockedCompareExchange(atomic, i ^ val, i);
} while (i != j);
return j;
}
#define InterlockedXor(a,b) _gInterlockedXor(a,b)
#endif
/* 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 _GMemoryBarrier MemoryBarrier
#else
static inline void _GMemoryBarrier (void) {
long dummy = 0;
InterlockedExchange (&dummy, 1);
}
#endif
/* /*
* http://msdn.microsoft.com/en-us/library/ms684122(v=vs.85).aspx * http://msdn.microsoft.com/en-us/library/ms684122(v=vs.85).aspx
*/ */
gint gint
(g_atomic_int_get) (const volatile gint *atomic) (g_atomic_int_get) (const volatile gint *atomic)
{ {
MemoryBarrier (); _GMemoryBarrier ();
return *atomic; return *atomic;
} }
@ -488,7 +550,7 @@ void
gint newval) gint newval)
{ {
*atomic = newval; *atomic = newval;
MemoryBarrier (); _GMemoryBarrier ();
} }
void void
@ -545,7 +607,7 @@ gpointer
{ {
const volatile gpointer *ptr = atomic; const volatile gpointer *ptr = atomic;
MemoryBarrier (); _GMemoryBarrier ();
return *ptr; return *ptr;
} }
@ -556,7 +618,7 @@ void
volatile gpointer *ptr = atomic; volatile gpointer *ptr = atomic;
*ptr = newval; *ptr = newval;
MemoryBarrier (); _GMemoryBarrier ();
} }
gboolean gboolean