Mercurial > sdl-ios-xcode
diff test/testatomic.c @ 5003:3a95a2b93eb3
Updated the atomic API for better use cases
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sat, 15 Jan 2011 12:41:59 -0800 |
parents | 9de326b3099c |
children | 0c72ae7b7cb2 |
line wrap: on
line diff
--- a/test/testatomic.c Sat Jan 15 12:34:43 2011 -0800 +++ b/test/testatomic.c Sat Jan 15 12:41:59 2011 -0800 @@ -1,18 +1,6 @@ #include <stdio.h> #include "SDL.h" -/* Make sure we have good macros for printing 32 and 64 bit values */ -#ifndef PRIu32 -#define PRIu32 "u" -#endif -#ifndef PRIu64 -#ifdef __WIN32__ -#define PRIu64 "I64u" -#else -#define PRIu64 "llu" -#endif -#endif - /* Absolutely basic tests just to see if we get the expected value after calling each function. @@ -21,109 +9,60 @@ char * tf(SDL_bool tf) { - static char *t = "true"; - static char *f = "false"; + static char *t = "TRUE"; + static char *f = "FALSE"; - if (tf) - { - return t; - } + if (tf) + { + return t; + } - return f; + return f; } int main(int argc, char *argv[]) { - - volatile Uint32 val32 = 0; - Uint32 ret32 = 0; - - volatile Uint64 val64 = 0; - Uint64 ret64 = 0; - - SDL_SpinLock lock = 0; + int value; + SDL_SpinLock lock = 0; - SDL_bool tfret = SDL_FALSE; - - printf("\nspin lock---------------------------------------\n\n"); + SDL_bool tfret = SDL_FALSE; - SDL_AtomicLock(&lock); - printf("AtomicLock lock=%d\n", lock); - SDL_AtomicUnlock(&lock); - printf("AtomicUnlock lock=%d\n", lock); - - printf("\n32 bit -----------------------------------------\n\n"); + printf("\nspin lock---------------------------------------\n\n"); - val32 = 0; - tfret = SDL_AtomicTestThenSet32(&val32); - printf("TestThenSet32 tfret=%s val=%"PRIu32"\n", tf(tfret), val32); - tfret = SDL_AtomicTestThenSet32(&val32); - printf("TestThenSet32 tfret=%s val=%"PRIu32"\n", tf(tfret), val32); + SDL_AtomicLock(&lock); + printf("AtomicLock lock=%d\n", lock); + SDL_AtomicUnlock(&lock); + printf("AtomicUnlock lock=%d\n", lock); - SDL_AtomicClear32(&val32); - printf("Clear32 val=%"PRIu32"\n", val32); - - ret32 = SDL_AtomicFetchThenIncrement32(&val32); - printf("FetchThenIncrement32 ret=%"PRIu32" val=%"PRIu32"\n", ret32, val32); + printf("\natomic -----------------------------------------\n\n"); - ret32 = SDL_AtomicFetchThenDecrement32(&val32); - printf("FetchThenDecrement32 ret=%"PRIu32" val=%"PRIu32"\n", ret32, val32); - - ret32 = SDL_AtomicFetchThenAdd32(&val32, 10); - printf("FetchThenAdd32 ret=%"PRIu32" val=%"PRIu32"\n", ret32, val32); - - ret32 = SDL_AtomicFetchThenSubtract32(&val32, 10); - printf("FetchThenSubtract32 ret=%"PRIu32" val=%"PRIu32"\n", ret32, val32); - - ret32 = SDL_AtomicIncrementThenFetch32(&val32); - printf("IncrementThenFetch32 ret=%"PRIu32" val=%"PRIu32"\n", ret32, val32); + SDL_atomic_t v; + + SDL_AtomicSet(&v, 0); + tfret = SDL_AtomicSet(&v, 10) == 0; + printf("AtomicSet(10) tfret=%s val=%"PRIu32"\n", tf(tfret), SDL_AtomicGet(&v)); + tfret = SDL_AtomicAdd(&v, 10) == 10; + printf("AtomicAdd(10) tfret=%s val=%"PRIu32"\n", tf(tfret), SDL_AtomicGet(&v)); - ret32 = SDL_AtomicDecrementThenFetch32(&val32); - printf("DecrementThenFetch32 ret=%"PRIu32" val=%"PRIu32"\n", ret32, val32); - - ret32 = SDL_AtomicAddThenFetch32(&val32, 10); - printf("AddThenFetch32 ret=%"PRIu32" val=%"PRIu32"\n", ret32, val32); - - ret32 = SDL_AtomicSubtractThenFetch32(&val32, 10); - printf("SubtractThenFetch32 ret=%"PRIu32" val=%"PRIu32"\n", ret32, val32); - -#ifdef SDL_HAS_64BIT_TYPE - printf("\n64 bit -----------------------------------------\n\n"); - - val64 = 0; - tfret = SDL_AtomicTestThenSet64(&val64); - printf("TestThenSet64 tfret=%s val=%"PRIu64"\n", tf(tfret), val64); - tfret = SDL_AtomicTestThenSet64(&val64); - printf("TestThenSet64 tfret=%s val=%"PRIu64"\n", tf(tfret), val64); - - SDL_AtomicClear64(&val64); - printf("Clear64 val=%"PRIu64"\n", val64); - - ret64 = SDL_AtomicFetchThenIncrement64(&val64); - printf("FetchThenIncrement64 ret=%"PRIu64" val=%"PRIu64"\n", ret64, val64); + SDL_AtomicSet(&v, 0); + SDL_AtomicIncRef(&v); + tfret = (SDL_AtomicGet(&v) == 1); + printf("AtomicIncRef() tfret=%s val=%"PRIu32"\n", tf(tfret), SDL_AtomicGet(&v)); + SDL_AtomicIncRef(&v); + tfret = (SDL_AtomicGet(&v) == 2); + printf("AtomicIncRef() tfret=%s val=%"PRIu32"\n", tf(tfret), SDL_AtomicGet(&v)); + tfret = (SDL_AtomicDecRef(&v) == SDL_FALSE); + printf("AtomicDecRef() tfret=%s val=%"PRIu32"\n", tf(tfret), SDL_AtomicGet(&v)); + tfret = (SDL_AtomicDecRef(&v) == SDL_TRUE); + printf("AtomicDecRef() tfret=%s val=%"PRIu32"\n", tf(tfret), SDL_AtomicGet(&v)); - ret64 = SDL_AtomicFetchThenDecrement64(&val64); - printf("FetchThenDecrement64 ret=%"PRIu64" val=%"PRIu64"\n", ret64, val64); - - ret64 = SDL_AtomicFetchThenAdd64(&val64, 10); - printf("FetchThenAdd64 ret=%"PRIu64" val=%"PRIu64"\n", ret64, val64); - - ret64 = SDL_AtomicFetchThenSubtract64(&val64, 10); - printf("FetchThenSubtract64 ret=%"PRIu64" val=%"PRIu64"\n", ret64, val64); - - ret64 = SDL_AtomicIncrementThenFetch64(&val64); - printf("IncrementThenFetch64 ret=%"PRIu64" val=%"PRIu64"\n", ret64, val64); + SDL_AtomicSet(&v, 10); + tfret = (SDL_AtomicCAS(&v, 0, 20) != 0); + printf("AtomicCAS() tfret=%s val=%"PRIu32"\n", tf(tfret), SDL_AtomicGet(&v)); + value = SDL_AtomicGet(&v); + tfret = (SDL_AtomicCAS(&v, value, 20) == value); + printf("AtomicCAS() tfret=%s val=%"PRIu32"\n", tf(tfret), SDL_AtomicGet(&v)); - ret64 = SDL_AtomicDecrementThenFetch64(&val64); - printf("DecrementThenFetch64 ret=%"PRIu64" val=%"PRIu64"\n", ret64, val64); - - ret64 = SDL_AtomicAddThenFetch64(&val64, 10); - printf("AddThenFetch64 ret=%"PRIu64" val=%"PRIu64"\n", ret64, val64); - - ret64 = SDL_AtomicSubtractThenFetch64(&val64, 10); - printf("SubtractThenFetch64 ret=%"PRIu64" val=%"PRIu64"\n", ret64, val64); -#endif - - return 0; - } + return 0; +}