atomic_test.c

00001 /*
00002  *
00003  *  simple atomic ops testing program
00004  *  (no paralel stuff, just see if the opcodes are "legal")
00005  * 
00006  *  Compile with: gcc -Wall -O3 -D__CPU_i386  on x86 machines
00007  *                gcc -Wall -O3 -D__CPU_x86_64 on amd64 machines
00008  *                gcc -mips2 -Wall -O2 -D__CPU_mips2  on mips machines
00009  *                gcc -m64 -Wall -O2 -D__CPU_mips64 on mips64 machines
00010  *                gcc -O3 -Wall -D__CPU_ppc on powerpc machines
00011  *                gcc -m64 -O3 -Wall -D__CPU_ppc64 on powerpc machines
00012  *                gcc -m64 -O3 -Wall -D__CPU_sparc64 -DSPARC64_MODE on 
00013  *                                                   ultrasparc machines
00014  *  -- andrei
00015  *
00016  *  
00017  */
00018 
00019 #include <stdio.h>
00020 
00021 #define CC_GCC_LIKE_ASM
00022 
00023 #include "../atomic_ops.h"
00024 
00025 #ifdef ATOMIC_OPS_USE_LOCK 
00026 /* hack to make lock work */
00027 #include "../lock_ops.h"
00028 
00029 gen_lock_t* _atomic_lock;
00030 
00031 gen_lock_t dummy_lock;
00032 
00033 #endif
00034 
00035 int main(int argc, char** argv)
00036 {
00037         int r;
00038         atomic_t v;
00039 #ifdef ATOMIC_OPS_USE_LOCK
00040         /* init the lock (emulate atomic_ops.c) */
00041         _atomic_lock=&dummy_lock;
00042         if (lock_init(_atomic_lock)==0){
00043                 fprintf(stderr, "ERROR: failed to initialize the lock\n");
00044                 goto error;
00045         }
00046 #endif
00047         
00048 #ifdef NOSMP
00049         printf("no-smp mode\n");
00050 #else
00051         printf("smp mode\n");
00052 #endif
00053         
00054         printf("starting memory barrier opcode tests...\n");
00055         membar();
00056         printf(" membar() .............................. ok\n");
00057         membar_write();
00058         printf(" membar_write() ........................ ok\n");
00059         membar_read();
00060         printf(" membar_read() ......................... ok\n");
00061         
00062         printf("\nstarting atomic ops basic tests...\n");
00063         
00064         mb_atomic_set(&v, 1);
00065         printf(" atomic_set, v should be 1 ............. %2d\n", mb_atomic_get(&v));
00066         mb_atomic_inc(&v);
00067         printf(" atomic_inc, v should be 2 ............. %2d\n", mb_atomic_get(&v));
00068         r=mb_atomic_inc_and_test(&v);
00069         printf(" atomic_inc_and_test, v should be  3 ... %2d\n", mb_atomic_get(&v));
00070         printf("                      r should be  0 ... %2d\n", r);
00071         
00072         mb_atomic_dec(&v);
00073         printf(" atomic_dec, v should be 2 ............. %2d\n", mb_atomic_get(&v));
00074         r=mb_atomic_dec_and_test(&v);
00075         printf(" atomic_dec_and_test, v should be  1 ... %2d\n", mb_atomic_get(&v));
00076         printf("                      r should be  0 ... %2d\n", r);
00077         r=mb_atomic_dec_and_test(&v);
00078         printf(" atomic_dec_and_test, v should be  0 ... %2d\n", mb_atomic_get(&v));
00079         printf("                      r should be  1 ... %2d\n", r);
00080         r=mb_atomic_dec_and_test(&v);
00081         printf(" atomic_dec_and_test, v should be -1 ... %2d\n", mb_atomic_get(&v));
00082         printf("                      r should be  0 ... %2d\n", r);
00083         
00084         mb_atomic_and(&v, 2);
00085         printf(" atomic_and, v should be 2 ............. %2d\n", mb_atomic_get(&v));
00086         
00087         mb_atomic_or(&v, 5);
00088         r=mb_atomic_get_and_set(&v, 0);
00089         printf(" atomic_or,  v should be 7 ............. %2d\n", r);
00090         printf(" atomic_get_and_set, v should be 0 ..... %2d\n", mb_atomic_get(&v));
00091 
00092         
00093         printf("\ndone.\n");
00094 #ifdef ATOMIC_OPS_USE_LOCK
00095         lock_destroy(_atomic_lock);
00096 #endif
00097         return 0;
00098 #ifdef ATOMIC_OPS_USE_LOCK
00099 error:
00100         return -1;
00101 #endif
00102 }