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;
+}