00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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
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
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 }