Use GCC's atomic loads in SDL_AtomicGet and SDL_AtomicGetPtr

This fixes errors reported by address sanitizer, and generates simpler
code on x86 architectures.
This commit is contained in:
James Legg 2017-03-29 15:48:22 +01:00
parent 266816b4aa
commit 1dc9ae5c1e

View File

@ -211,21 +211,29 @@ SDL_AtomicAdd(SDL_atomic_t *a, int v)
int int
SDL_AtomicGet(SDL_atomic_t *a) SDL_AtomicGet(SDL_atomic_t *a)
{ {
#ifdef HAVE_GCC_ATOMICS
return __atomic_load_n(&a->value, __ATOMIC_SEQ_CST);
#else
int value; int value;
do { do {
value = a->value; value = a->value;
} while (!SDL_AtomicCAS(a, value, value)); } while (!SDL_AtomicCAS(a, value, value));
return value; return value;
#endif
} }
void * void *
SDL_AtomicGetPtr(void **a) SDL_AtomicGetPtr(void **a)
{ {
#ifdef HAVE_GCC_ATOMICS
return __atomic_load_n(a, __ATOMIC_SEQ_CST);
#else
void *value; void *value;
do { do {
value = *a; value = *a;
} while (!SDL_AtomicCASPtr(a, value, value)); } while (!SDL_AtomicCASPtr(a, value, value));
return value; return value;
#endif
} }
void void