tsemacquire.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include <u.h>
  2. #include <libc.h>
  3. int32_t nprocs = 32;
  4. int32_t nloops = 100000;
  5. int32_t x = 1;
  6. int32_t incr;
  7. void
  8. tsemloop(void)
  9. {
  10. int i;
  11. i = 0;
  12. while(i < nloops){
  13. if(tsemacquire(&x, 10)){
  14. if((i % 1000) == 0)
  15. sleep(10);
  16. incr++;
  17. i++;
  18. semrelease(&x, 1);
  19. } else {
  20. //print("pid %d timeout\n", getpid());
  21. }
  22. }
  23. exits(nil);
  24. }
  25. void
  26. semloop(void)
  27. {
  28. int i;
  29. i = 0;
  30. while(i < nloops){
  31. if(semacquire(&x, 1)){
  32. incr++;
  33. i++;
  34. semrelease(&x, 1);
  35. } else {
  36. sysfatal("semacquire failed");
  37. }
  38. }
  39. }
  40. void
  41. main(void)
  42. {
  43. int pid, i;
  44. incr = 0;
  45. for(i = 0; i < nprocs; i++){
  46. switch(rfork(RFMEM|RFPROC)){
  47. case -1:
  48. sysfatal("rfork");
  49. case 0:
  50. tsemloop();
  51. exits(nil);
  52. default:
  53. break;
  54. }
  55. }
  56. for(i = 0; i < nprocs; i++)
  57. waitpid();
  58. print("tsemloop incr %d\n", incr);
  59. if(incr != nprocs*nloops){
  60. print("FAIL\n");
  61. exits("FAIL");
  62. }
  63. incr = 0;
  64. for(i = 0; i < nprocs; i++){
  65. switch(rfork(RFMEM|RFPROC)){
  66. case -1:
  67. sysfatal("rfork");
  68. case 0:
  69. semloop();
  70. exits(nil);
  71. default:
  72. break;
  73. }
  74. }
  75. for(i = 0; i < nprocs; i++)
  76. waitpid();
  77. print("semloop incr %d\n", incr);
  78. if(incr != nprocs*nloops){
  79. print("FAIL\n");
  80. exits("FAIL");
  81. }
  82. incr = 0;
  83. for(i = 0; i < nprocs; i++){
  84. switch(rfork(RFMEM|RFPROC)){
  85. case -1:
  86. sysfatal("rfork");
  87. case 0:
  88. if((i&1) == 0)
  89. semloop();
  90. else
  91. tsemloop();
  92. exits(nil);
  93. default:
  94. break;
  95. }
  96. }
  97. for(i = 0; i < nprocs; i++)
  98. waitpid();
  99. print("mixed incr %d\n", incr);
  100. if(incr != nprocs*nloops){
  101. print("FAIL\n");
  102. exits("FAIL");
  103. }
  104. print("PASS\n");
  105. exits(nil);
  106. }