atomic_test.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. *
  3. * simple atomic ops testing program
  4. * (no parallel stuff, just see if the opcodes are "legal")
  5. *
  6. * Compile with: gcc -Wall -O3 -D__CPU_i386 on x86 machines
  7. * gcc -Wall -O3 -D__CPU_x86_64 on amd64 machines
  8. * gcc -mips2 -Wall -O2 -D__CPU_mips2 on mips machines
  9. * gcc -m64 -Wall -O2 -D__CPU_mips64 on mips64 machines
  10. * gcc -O3 -Wall -D__CPU_ppc on powerpc machines
  11. * gcc -m64 -O3 -Wall -D__CPU_ppc64 on powerpc machines
  12. * gcc -m64 -O3 -Wall -D__CPU_sparc64 -DSPARC64_MODE on
  13. * ultrasparc machines
  14. * -- andrei
  15. *
  16. *
  17. */
  18. #include <stdio.h>
  19. #define CC_GCC_LIKE_ASM
  20. #include "../atomic_ops.h"
  21. #ifdef ATOMIC_OPS_USE_LOCK
  22. /* hack to make lock work */
  23. #include "../lock_ops.h"
  24. gen_lock_t* _atomic_lock;
  25. gen_lock_t dummy_lock;
  26. #endif
  27. int main(int argc, char** argv)
  28. {
  29. int r;
  30. atomic_t v;
  31. #ifdef ATOMIC_OPS_USE_LOCK
  32. /* init the lock (emulate atomic_ops.c) */
  33. _atomic_lock=&dummy_lock;
  34. if (lock_init(_atomic_lock)==0){
  35. fprintf(stderr, "ERROR: failed to initialize the lock\n");
  36. goto error;
  37. }
  38. #endif
  39. #ifdef NOSMP
  40. printf("no-smp mode\n");
  41. #else
  42. printf("smp mode\n");
  43. #endif
  44. printf("starting memory barrier opcode tests...\n");
  45. membar();
  46. printf(" membar() .............................. ok\n");
  47. membar_write();
  48. printf(" membar_write() ........................ ok\n");
  49. membar_read();
  50. printf(" membar_read() ......................... ok\n");
  51. printf("\nstarting atomic ops basic tests...\n");
  52. mb_atomic_set(&v, 1);
  53. printf(" atomic_set, v should be 1 ............. %2d\n", mb_atomic_get(&v));
  54. mb_atomic_inc(&v);
  55. printf(" atomic_inc, v should be 2 ............. %2d\n", mb_atomic_get(&v));
  56. r=mb_atomic_inc_and_test(&v);
  57. printf(" atomic_inc_and_test, v should be 3 ... %2d\n", mb_atomic_get(&v));
  58. printf(" r should be 0 ... %2d\n", r);
  59. mb_atomic_dec(&v);
  60. printf(" atomic_dec, v should be 2 ............. %2d\n", mb_atomic_get(&v));
  61. r=mb_atomic_dec_and_test(&v);
  62. printf(" atomic_dec_and_test, v should be 1 ... %2d\n", mb_atomic_get(&v));
  63. printf(" r should be 0 ... %2d\n", r);
  64. r=mb_atomic_dec_and_test(&v);
  65. printf(" atomic_dec_and_test, v should be 0 ... %2d\n", mb_atomic_get(&v));
  66. printf(" r should be 1 ... %2d\n", r);
  67. r=mb_atomic_dec_and_test(&v);
  68. printf(" atomic_dec_and_test, v should be -1 ... %2d\n", mb_atomic_get(&v));
  69. printf(" r should be 0 ... %2d\n", r);
  70. mb_atomic_and(&v, 2);
  71. printf(" atomic_and, v should be 2 ............. %2d\n", mb_atomic_get(&v));
  72. mb_atomic_or(&v, 5);
  73. r=mb_atomic_get_and_set(&v, 0);
  74. printf(" atomic_or, v should be 7 ............. %2d\n", r);
  75. printf(" atomic_get_and_set, v should be 0 ..... %2d\n", mb_atomic_get(&v));
  76. printf("\ndone.\n");
  77. #ifdef ATOMIC_OPS_USE_LOCK
  78. lock_destroy(_atomic_lock);
  79. #endif
  80. return 0;
  81. #ifdef ATOMIC_OPS_USE_LOCK
  82. error:
  83. return -1;
  84. #endif
  85. }